分配给'struct compartido'类型时不兼容的类型

时间:2012-09-10 15:32:26

标签: c pointers multiprocessing

我对此代码有一个问题。我应该创建一个结构,并在父亲创建的5个新流程中共享它:

#include <stdio.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/sem.h>
#include <time.h>

struct compartido {
    int pid1, pid2, pid3, pid4, pid5;   
    int propietario;            
    int contador;                   
    int pidpadre;
};

struct compartido var;  


int main(int argc, char *argv[]) {

    key_t llave1,llavesem;
    int idmem,idsem;    
    llave1=ftok("/tmp",'a');

    idmem=shmget(llave1,sizeof(int),IPC_CREAT|0600);
    if (idmem==-1) {
       perror ("shmget");
       return 1;
    }

var=shmat(idmem,0,0); /*This line is giving the error*/

/*rest of the code*/
}

确切的错误是: 错误:从类型'void *'

指定类型'struct compartido'时出现不兼容的类型

我需要将此结构放在共享变量中,以便能够查看和修改来自6进程(5个子进程和父进程)的所有数据。

我做得不好?在此先感谢和最诚挚的问候,

4 个答案:

答案 0 :(得分:2)

你可能应该声明一个指针

 struct compartido* var; 

然后用

初始化它
 var= (struct compartido*) shmat(idmem,0,0); 

您应该处理错误案例

 if ((void*)var == (void*)-1) {
    perror("shmat failed");
    exit(1);
 }

因为shmat(2)(在Linux上)syscall可能会失败。

最后,使用指针字段表示法来访问字段,例如var->propietariovar->pidpatre等......

答案 1 :(得分:1)

您正在尝试为结构var指定shmat()的返回值,该值为void *

我怀疑你错过了间接?

[见Basile的“快照”帖子更详细]

答案 2 :(得分:0)

您正在指定一个结构变量的指针。 我会做以下事情:

idmem=shmget(llave1,sizeof(struct compartido),IPC_CREAT|0600);
if (idmem==-1) {
   perror ("shmget");
   return 1;
}
struct compartido *var=shmat(idmem,0,0);

请注意,您在示例中分配的内容小于struct compartido大小。

答案 3 :(得分:0)

是的,你正在做的事情很糟糕:

此行声明了一个结构 -

struct compartido var;  

然后你要指定一个指针:

var=shmat(idmem,0,0); //returns a void*

查看shmat的工作原理

相关问题