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);

它应该直接在您的共享内存段中填充此结构,子进程应该会看到更改。

最重要的是,任何实际直接写入共享内存段的内容都会被子进程看到。共享内存段内指向共享内存段外的指针将不起作用。