C 共享内存传递结构体中的结构体
C shared memory passing structure in structure
我正在制作一个 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,我不知道 why.It 适用于简单变量但不适用于此结构,知道为什么吗?
您不能在两个进程之间共享 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);
它应该直接在您的共享内存段中填充此结构,子进程应该会看到更改。
最重要的是,任何实际直接写入共享内存段的内容都会被子进程看到。共享内存段内指向共享内存段外的指针将不起作用。
我正在制作一个 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,我不知道 why.It 适用于简单变量但不适用于此结构,知道为什么吗?
您不能在两个进程之间共享 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);
它应该直接在您的共享内存段中填充此结构,子进程应该会看到更改。
最重要的是,任何实际直接写入共享内存段的内容都会被子进程看到。共享内存段内指向共享内存段外的指针将不起作用。