从共享内存中读取可变数量的结构
Reading variable number of structs from 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;
有一个reader程序必须读取写在共享内存段中的所有结构,但不知道有多少结构。
我试过以下方法:
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。
您正在检查 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++;
-- 这也很糟糕(我认为即使是编译器也应该在这里抱怨)。如果要得到"next"x,单独使用前缀自增:++x
在 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;
有一个reader程序必须读取写在共享内存段中的所有结构,但不知道有多少结构。 我试过以下方法:
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。
您正在检查 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++;
-- 这也很糟糕(我认为即使是编译器也应该在这里抱怨)。如果要得到"next"x,单独使用前缀自增:++x