我有一个需要在两个进程之间共享字符串的程序。我已经声明了一个包含*char
数组的结构。在主进程分叉之前,此结构分配有shmget
和shmat
。
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
,它不会。
提前致谢!
答案 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}这样的共享内存似乎可能效果不佳。