我对此代码有一个问题。我应该创建一个结构,并在父亲创建的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个子进程和父进程)的所有数据。
我做得不好?在此先感谢和最诚挚的问候,
答案 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->propietario
或var->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的工作原理