C共享内存传递结构的结构

时间:2015-11-27 15:17:24

标签: c structure shared-memory

我正在制作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,我不知道为什么。它适用于简单的变量,但不适用于这种结构,任何想法为什么?

1 个答案:

答案 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的定义,以便dataUltimoPedidotempo而不是tempo*。然后调用此函数,如:

buscadata(&s_m->dataUltimoPedido);

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

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