bur*_*n16 5 c string shared-memory
我有一个程序需要在两个进程之间共享一个字符串.我已经声明了一个包含数组的结构*char.在主进程分叉之前shmget和shmat之前分配此结构.
typedef struct Queue
{
int index;
char *directory[10];
} Queue;
Run Code Online (Sandbox Code Playgroud)
在其中一个进程中,我尝试设置值:( data->dir_name是*char一个字符串,如"/ data1")
queue->directory[i] = data->dir_name; // Option 1
queue->directory[i] = "foo"; // Option 2
Run Code Online (Sandbox Code Playgroud)
我的问题是,上面的第一个和第二个陈述之间有什么区别?当设置queue->directory[i]到"foo",其他进程看到它.但是,传递值data->dir_name,它没有.
提前致谢!
问题是你只是指定一个指针,而不是复制字符串数据.在第一种情况下,您将值设置为指向第二个进程无法看到的内存.当您执行第一行时,data->dir_name将放入指针queue->directory[i],但是当另一个进程在其自己的内存空间中查看该内存地址时,数据不存在.另一方面,第二行将静态字符串的地址"foo"放入变量中.由于进程是从同一个源编译的,因此该字符串在每个进程的内存中位于相同的位置,因此第二个进程可以看到它.
你想要做的是在你strcpy的目录名称的结构中有一个缓冲区.你需要
char directory[10][200];
Run Code Online (Sandbox Code Playgroud)
和
strcpy (queue->directory[i], data->dir_name);
Run Code Online (Sandbox Code Playgroud)
您需要检查字符串长度是否小于200(在这种情况下),如果时间太长则报告相应的错误.我不熟悉共享内存函数,以确切知道如何执行malloc等效操作; 如果你能做到的话; 然后你将字符串复制到malloced共享内存中,并将指针放在一个数组中,就像你在代码中一样.从非常快速的谷歌搜索来看,似乎这样的malloc共享内存可能效果不佳.