从共享内存中读取可变数量的结构

时间:2015-04-03 05:29:37

标签: c shared-memory

在C程序中,我创建一个大尺寸的共享内存段,然后将可变数量的结构放入其中(在本例中为2)。

strcut message * x;
x = (struct message *)shmat(shmid,NULL,0);
x[0].a = 1;
x[0].b = 2;
x[1].a = 3;
x[1].b = 4;

有一个读取器程序必须读取共享内存段中写入的所有结构,但不知道有多少结构。 我尝试了以下方式:

struct message * x;
x = (struct message *)shmat(shmid,NULL,0);
 while(x!=NULL)
 {
printf("x.a = %d\n",x->a);
printf("x.b = %d\n",x->b);
printf("\n\n");
x=x++;
}

它正确地给了我2个结构但是之后它给了我0(或随机垃圾值)多次(对于a和b),直到它用完共享内存段然后给出了分段错误。 我该怎么做呢?

我正在使用UBUNTU。

1 个答案:

答案 0 :(得分:2)

您正在检查while(x != NULL) - 如果shmat()返回非NULL值,它永远不会为NULL(除非您将指针溢出计数,但您将提前获得SEGV)。

如果你想在内存中保留一堆结构,也要保存它们的数量并在消费者方面重复使用。

即。生产者:

char* ptr = shmat(shmid,NULL,0);

if(ptr != ((char*) -1)) {
    uint32_t* p_msg_count = (uint32_t*) ptr; 
    struct message* x = (struct message*) (ptr + sizeof(uint32_t));

    *p_msg_count = 2;  // <------

    // Fill in x
}

消费者:

char* ptr = shmat(shmid,NULL,0);
int xid, xcount;

if(ptr != ((char*) -1)) {
    uint32_t* p_msg_count = (uint32_t*) ptr; 
    struct message* x = (struct message*) (ptr + sizeof(uint32_t));

    xcount = (int) *p_msg_count; 
    for(xid = 0; xid < xcount; ++xid) {
        // Print x[xid] 
    }
}

P.S。 x = x++; - 这也很糟糕(我认为甚至编译器也应该在这里抱怨)。如果你想得到&#34; next&#34; x,单独使用前缀增量:++x