【发布时间】:2014-12-25 22:16:54
【问题描述】:
我有一个充当缓冲区的数据结构。这是两个在其中具有 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);
【问题讨论】:
-
什么是color的数据类型:ptr->buf1.color = color; ?
-
颜色是 char *color;后来颜色=“红色”;我能够在结构中使用 strcpy 和 char color[8] 而不是使用指针来解决它,但我想知道这是否是唯一的方法。我在这里找到了解决方案:stackoverflow.com/questions/15534923/… 有趣的是,线程没有出现这些问题。
-
我想到了两种可能性:(1)您是将数据放在共享内存段中还是分配它? (2) 两个进程是否都将共享段映射到同一个虚拟地址?如果不在第二个,消费者看到的指针将指向错误的位置。如果不清楚,我建议向我们展示映射共享内存和分配缓冲区的代码。
标签: c string fork semaphore strcpy