gpt4 book ai didi

c - 使用 struct 和 malloc 共享内存叉

转载 作者:行者123 更新时间:2023-12-03 21:33:59 27 4
gpt4 key购买 nike

我对 fork 生成的父进程和子进程之间的共享内存有问题。
我知道如何使用具有原始类型的共享内存 here .

虽然我不知道如何共享包含可以通过 malloc 分配的指针的结构。

例如,假设我从上一个链接中获取了以下代码并进行了一些修改。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/file.h>
#include <sys/mman.h>
#include <sys/wait.h>

typedef struct Data {
char * name;
} Data;

void error_and_die(const char *msg) {
perror(msg);
exit(EXIT_FAILURE);
}

int main(int argc, char *argv[]) {
int r;

const char *memname = "sample";
const size_t region_size = sysconf(_SC_PAGE_SIZE);

int fd = shm_open(memname, O_CREAT | O_TRUNC | O_RDWR, 0666);
if (fd == -1)
error_and_die("shm_open");

r = ftruncate(fd, region_size);
if (r != 0)
error_and_die("ftruncate");

Data * data = (Data *) malloc(sizeof(data));
data->name=(char *) malloc(100*sizeof(char));

void *ptr = mmap(0, region_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
if (ptr == MAP_FAILED)
error_and_die("mmap");
close(fd);

ptr=(Data *) data;

pid_t pid = fork();

if (pid == 0) {
//u_long *d = (u_long *) ptr;
//*d = 0xdbeebee;
data->name="bob";
printf("CHILD child wrote %s\n", (*(Data *)ptr).name);
exit(0);
}
else {
int status;
waitpid(pid, &status, 0);
//printf("child wrote %#lx\n", *(u_long *) ptr);
printf("PARENT child wrote %s\n", (*(Data *)ptr).name);
}

r = munmap(ptr, region_size);
if (r != 0)
error_and_die("munmap");

r = shm_unlink(memname);
if (r != 0)
error_and_die("shm_unlink");

return 0;
}

我想在父进程和子进程之间更改结构内的数据以允许 IPC。
我能怎么做?

谢谢

最佳答案

如果你问“如何用 malloc() 做”,这是不可能的,除非你自己写 malloc()从共享内存区域中的缓冲区分配的实现。这是一种可能的方法,但超出了这个答案。否则 malloc() 分配的内存不会在父子之间共享;每个人都有自己的副本。
如果您询问“如何更改示例以使其正常工作” - 只需使用 mmap() 返回的内存即可。称呼。
为简化起见,让我们声明 name作为 Data 中的数组结构体:

typedef struct Data {
char name[100];
} Data;
那么主代码就变成了:
void *ptr = mmap(0, region_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
if (ptr == MAP_FAILED)
error_and_die("mmap");
close(fd);

Data * data = ptr;

pid_t pid = fork();

if (pid == 0) {
strcpy(data->name, "bob");
printf("CHILD child wrote %s\n", (*(Data *)ptr).name);
exit(0);
}
else {
int status;
waitpid(pid, &status, 0);
printf("PARENT child wrote %s\n", (*(Data *)ptr).name);
}
输出:

CHILD child wrote bob

PARENT child wrote bob

关于c - 使用 struct 和 malloc 共享内存叉,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49087264/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com