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

标签 c string fork semaphore strcpy

我有一个充当缓冲区的数据结构。这是两个结构,其中有一个 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/

相关文章:

c - 当 WFP 标注驱动程序以 SERVICE_SYSTEM_START 启动时,FwpmEngineOpen 返回 EPT_NT_CANT_PERFORM_OP

c++ - 我可以使用 C++ 编译器来编译 C 源代码吗?

ios - Swift - 按钮中的属性字符串

string - Protractor - 获取浏览器标题作为字符串

c - 初学者,带源代码的 C 语言 switch 中的字符串。可能的?

c - 从 C 中的 parent 那里 fork 任意数量的 child ?

linux - 为什么从用作监视服务的 bash 脚本启动的进程在脚本终止后仍然存在?

c - 从两个不同的值打印输出?

C++在 child 还活着时循环

c - 如何在C中以十六进制格式打印2或4个字节