我有一个充当缓冲区的数据结构。它的两个结构中有char *颜色。我能够自己存储和检索每个生产者过程中的正确颜色,但消费者似乎没有在颜色变量中看到任何东西,尽管它知道它不是空的。怎么会这样?
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);
答案 0 :(得分:1)
即使buf
可能在共享内存中,也不能保证color
也指向共享内存中的某些内容。我的猜测是color
指向的是一个只对生产者进程而不是消费者进程可见的地址。要解决此问题,您可以将color
字段定义为固定长度的char数组,并使用
strncpy(ptr->buf1.color, color, BUFLEN);
ptr->buf1.color[BUFLEN-1] = '\0';
设置颜色。
答案 1 :(得分:0)
我认为你没有正确地对结构和缓冲区进行malloc,因为它们没有受到保护,因此它会被任何东西覆盖。尝试做这样的事情:
typedef struct {
char *color;
struct timeval time;
} data_struct;
data_struct *temp=(data_struct*)malloc(sizeof(data_struct));
temp->color = (char *)malloc(strlen(color)+1);
strcpy(temp->color, color);
我认为这样做不会产生问题。但是请记住首先释放分配的内存然后结构化。
free(temp->color);
free(temp);
答案 2 :(得分:0)
它不起作用,因为你有一个存储指针的进程,以及一个读取该指针的独立进程。但是这两个进程不共享相同的地址空间,因此读取时指针无意义。您可以通过以下几种方式解决这个问题:
char color[30]
)。