存储在共享内存中后,字符串无法正常显示

时间:2014-10-30 01:11:54

标签: c string fork semaphore strcpy

我有一个充当缓冲区的数据结构。它的两个结构中有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);

3 个答案:

答案 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)

它不起作用,因为你有一个存储指针的进程,以及一个读取该指针的独立进程。但是这两个进程不共享相同的地址空间,因此读取时指针无意义。您可以通过以下几种方式解决这个问题:

  1. 使用线程代替进程;通过这种方式,生产者和消费者将拥有一个地址空间,而另一个地址的指针在另一个地址空间中有效。
  2. 将文本直接存储在结构中,没有指针间接(即char color[30])。
  3. 在结构中存储“偏移指针”,并将字符数据存储在共享内存区域中的某个位置(一种池分配器)。
  4. 在生产者和消费者中创建一个固定字符串数组,并将索引存储到该查找表中。如果提前知道字符串,则此方法有效。