在共享内存进程中分配字符串

时间:2013-03-20 21:18:13

标签: c string shared-memory

我有一个需要在两个进程之间共享字符串的程序。我已经声明了一个包含*char数组的结构。在主进程分叉之前,此结构分配有shmgetshmat

typedef struct Queue
{
    int index;
    char *directory[10];
} Queue;

在其中一个过程中,我尝试设置值:(data->dir_name*char到字符串,例如“/ data1”)

queue->directory[i] = data->dir_name; // Option 1
queue->directory[i] = "foo";          // Option 2

我的问题是,上面的第一个和第二个陈述有什么区别?将queue->directory[i]设置为"foo"时,其他进程会看到它。但是,传递值data->dir_name,它不会。

提前致谢!

1 个答案:

答案 0 :(得分:5)

问题是你只是指定一个指针,而不是复制字符串数据。在第一种情况下,您将值设置为指向第二个进程无法看到的内存。当你执行第一行时,指针data->dir_name被放入queue->directory[i],但当另一个进程在其自己的内存空间中查看该内存地址时,数据不存在。另一方面,第二行将静态字符串"foo"的地址放入变量中。由于进程是从同一个源编译的,因此该字符串在每个进程的内存中位于相同的位置,因此第二个进程可以看到它。

你想要做的是在结构中有一个缓冲区,你strcpy目录名称。你需要

char directory[10][200];

strcpy (queue->directory[i], data->dir_name);

您需要检查字符串长度是否小于200(在这种情况下),如果时间太长则报告相应的错误。我不熟悉共享内存函数,以确切知道如何执行malloc等效操作;如果你能做到的话;然后你将字符串复制到malloc ed共享内存中,并将指针放在一个数组中,就像你在代码中一样。从一个非常快速的谷歌搜索来看,{{1}这样的共享内存似乎可能效果不佳。