gpt4 book ai didi

c - 字符串存储到共享内存后无法正常显示

转载 作者:太空宇宙 更新时间:2023-11-04 03:43:38 26 4
gpt4 key购买 nike

我有一个充当缓冲区的数据结构。这是两个结构,其中有一个 char *color。我能够自己从每个生产者进程中存储和检索正确的颜色,但消费者似乎看不到颜色变量中的任何内容,尽管它知道它不为空。怎么会这样?

typedef struct {
char *color;
struct timeval time;
} data_struct;

typedef struct{
data_struct buf1;
data_struct buf2;
} buffer;

在我存储的生产者中:

        ptr->buf1.color = color;
gettimeofday (&tval, NULL);
ptr->buf1.time = tval;

然后我能够打印它刚刚存储的颜色,它确实在同一过程中工作。但是消费者使用:

printf("%s\t", ptr->buf1.color);
struct timeval tval = ptr->buf1.time;
printf("%ld\n", (tval.tv_sec)*1000000L + tval.tv_usec);

最后他只打印了一个空白区域,然后是一个制表符,然后是秒数。它如何访问相同的共享内存但看不到我的字符串?这个大致相同的代码在线程版本中工作得很好。感谢您的帮助!

更新共享内存段。

    int shmem_id;
buffer *shmem_ptr;
key_t key = 7484;
int size = 2048;
int flag = 1023;

char keystr[10];

/* create a shared memory segment */
shmem_id = shmget (key, size, flag);
shmem_ptr = shmat (shmem_id, (void *) NULL, 1023);
shmem_ptr->buf1.color = NULL;
shmem_ptr->buf2.color = NULL;
sprintf (keystr, "%d", key);

最佳答案

尽管 buf 可能在共享内存中,但这并不能保证 color 也指向共享内存中的某些内容。我的猜测是 color 指向某个地址,该地址仅对生产者进程可见,对消费者进程不可见。要解决此问题,您可以将 color 字段定义为固定长度的字符数组,并使用

strncpy(ptr->buf1.color, color, BUFLEN);
ptr->buf1.color[BUFLEN-1] = '\0';

设置颜色。

关于c - 字符串存储到共享内存后无法正常显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26643413/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com