我想从子进程创建可以从其他进程使用的共享内存。但是当我在子进程中创建共享内存时,父进程在尝试使用共享内存中的指针时崩溃。
#include <stdio.h>
#include <unistd.h>
#include <sys/mman.h>
struct list_node
{
char *data;
};
static int create_shared(void **pointer, int size)
{
*pointer = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_ANON | MAP_SHARED, -1, 0);
if(*pointer == MAP_FAILED)
{
perror("mmap:");
return -1;
}
return 0;
}
int main(void)
{
int rtrn;
pid_t pid;
struct list_node *node;
pid = fork();
if(pid == 0)
{
rtrn = create_shared((void **)&node, sizeof(struct list_node));
if(rtrn < 0)
{
printf("Can't create shared node\n");
return -1;
}
rtrn = asprintf(&node->data, "Test\n");
if(rtrn < 0)
{
perror("asprintf:");
return -1;
}
printf("data_child: %s\n", node->data);
}
else if(pid > 0)
{
/* Parent. */
sleep(1); // Make sure child runs first.
printf("data_parent: %s\n", node->data);
}
else
{
perror("fork");
return -1;
}
return 0;
}
但是当我在父进程中创建共享内存时,它可以在子进程中使用,它不仅仅是来自fork()
的副本,因为子进程可以更改指针而父进程看到&# 39;是的。在下面的示例中,子项将node->data
的值从test更改为best。
#include <stdio.h>
#include <unistd.h>
#include <sys/mman.h>
struct list_node
{
char *data;
};
static int create_shared(void **pointer, int size)
{
*pointer = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_ANON | MAP_SHARED, -1, 0);
if(*pointer == MAP_FAILED)
{
perror("mmap:");
return -1;
}
return 0;
}
int main(void)
{
int rtrn;
struct list_node *node;
rtrn = create_shared((void **)&node, sizeof(struct list_node));
if(rtrn < 0)
{
printf("Can't create shared node\n");
return -1;
}
rtrn = asprintf(&node->data, "Test\n");
if(rtrn < 0)
{
perror("asprintf:");
return -1;
}
pid_t pid;
pid = fork();
if(pid == 0)
{
printf("data_child: %s\n", node->data);
node->data = "Best";
}
else if(pid > 0)
{
/* Parent. */
sleep(1); // Make sure child runs first.
printf("data_parent: %s\n", node->data);
}
else
{
perror("fork");
return -1;
}
return 0;
}
那么如何从子级创建共享内存以便父级或其他子进程可以访问它?
我尝试使用create_shared()aka mmap标记char *data
指向共享内存的内存,但在尝试打印char *data
指向的字符串时仍然会遇到段错误。以下是我尝试将data
设置为共享内存的方法。我也试过memcpy认为只是将char *data
设置为test只是将指针设置为非共享内存,但这也不起作用。
rtrn = create_shared((void **)&node->data, 5);
if(rtrn < 0)
{
printf("Can't create shared data\n");
return -1;
}
node->data = "Test";
//memcpy(node->data, "Test", 4);
答案 0 :(得分:0)
char *data;
你共享了部分内存,但只包含一个指针。
其指向的位置对其他进程不可见。
分享字符串。或者,如果您知道它的最大长度,请使用字符数组而不是指针。
在第二个示例中,"Best"
是一个字符串文字,将放在可执行文件中。您设置为指向此地址的指针,并且由于两个进程使用相同的可执行文件,因此地址也将相同,并且指针将有效。
注意:我认为这超出了C标准的范围,我不确定POSIX标准对此有何看法,因此可能无法移植......