我正在制作Dns服务器并在执行此操作时遇到问题 因此,我必须使用该共享内存在结构中传递结构。 我首先在父进程中执行此操作:
if((shmid=shmget(IPC_PRIVATE,sizeof(shared_mem),IPC_CREAT | 0777))<0){
perror("Error in shmget\n");
exit(1);
}
#ifdef DEBUG
else{
puts("Segmento alocado com sucesso.\n");
}
#endif
//ataches memory to address
if((s_m = (shared_mem*) shmat(shmid,NULL,0)) ==(shared_mem*) -1){
perror("Error in shmat\n");
exit(1);
}
#ifdef DEBUG
else{
puts("Memoria conectada ao adereço com sucesso.\n");
}
然后,我声明我的变量:
s_m->dataUltimoPedido=(tempo*) malloc(sizeof(tempo));
s_m->dataUltimoPedido=(tempo*) buscadata();
是buscadata()
tempo* buscadata(){
tempo* busca;
busca=(tempo*)malloc(sizeof(tempo));
time_t rawtime;
struct tm *tminfo;
time ( &rawtime );
tminfo = localtime ( &rawtime );
busca->hora=tminfo->tm_hour;
busca->min=tminfo->tm_min;
busca->mes=(tminfo->tm_mon)+1;
busca->ano=(tminfo->tm_year)+1900;
busca->dia=tminfo->tm_mday;
return busca;
}
每次有请求时我都会这样做:
s_m->dataUltimoPedido=(tempo*) buscadata();
并且在这个过程中它起作用。 但是在每30秒运行一次的子进程中,我试图像这样访问它:
shared_mem* s_m;
s_m =(shared_mem*) shmat(shmid, NULL, 0);
while(1){
printf("%d---------------------\n",s_m->dataUltimoPedido->hora);
}
这总是打印0,我不知道为什么。它适用于简单的变量,但不适用于这种结构,任何想法为什么?
答案 0 :(得分:0)
您无法在两个进程之间共享malloc()
返回的指针。如果您执行以下操作:
void buscadata(tempo* busca){
time_t rawtime;
struct tm *tminfo;
time ( &rawtime );
tminfo = localtime ( &rawtime );
busca->hora=tminfo->tm_hour;
busca->min=tminfo->tm_min;
busca->mes=(tminfo->tm_mon)+1;
busca->ano=(tminfo->tm_year)+1900;
busca->dia=tminfo->tm_mday;
}
更改shared_mem
的定义,以便dataUltimoPedido
为tempo
而不是tempo*
。然后调用此函数,如:
buscadata(&s_m->dataUltimoPedido);
它应该直接在共享内存段中填充此结构,子进程应该看到更改。
最重要的是,子进程将看到实际直接写入共享内存段的任何内容。共享内存段中指向共享内存段之外的指针的指针将不起作用。