5

我有一个程序需要在两个进程之间共享一个字符串。我已经声明了一个包含*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]to"foo"时,其他进程会看到它。但是,传递 value data->dir_name,它没有。

提前致谢!

4

1 回答 1

5

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

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

char directory[10][200];

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

您需要检查字符串长度是否小于 200(在这种情况下),如果太长则报告相应的错误。我不熟悉共享内存功能,无法确切知道如何进行malloc等效操作;如果你能做到的话;然后你会将字符串复制到malloced 共享内存中,并将指向它的指针放在一个数组中,就像你在代码中一样。但是,通过非常快速的 Google 搜索,似乎这样的malloc共享内存可能效果不佳。

于 2013-03-20T21:29:10.877 回答