Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C语言:如何通过IPC在父进程和子进程(分叉)之间共享结构(或者,如果不可能,一个数组)?_C_Global Variables_Process_Fork_Shared Memory - Fatal编程技术网

C语言:如何通过IPC在父进程和子进程(分叉)之间共享结构(或者,如果不可能,一个数组)?

C语言:如何通过IPC在父进程和子进程(分叉)之间共享结构(或者,如果不可能,一个数组)?,c,global-variables,process,fork,shared-memory,C,Global Variables,Process,Fork,Shared Memory,我在谷歌上搜索了两周,没有得到任何答案。这就是我所拥有的: 父进程,它创建一个structmyStruct,基本上是一个使用指针的链表(如果这是一个主要问题,我可以接受使用固定大小的数组) 使用fork()创建的固定数量的子进程,需要对父进程创建的结构(或数组)进行读/写访问 我不知道如何使变量myStruct在进程之间共享 我尝试使用SysV IPC函数来解决这个问题,比如shmget(),shmat(),等等。。。为了在共享内存中分配变量,但我不知道如何使用void内存指针将值读/写到m

我在谷歌上搜索了两周,没有得到任何答案。这就是我所拥有的:

  • 父进程,它创建一个struct
    myStruct
    ,基本上是一个使用指针的链表(如果这是一个主要问题,我可以接受使用固定大小的数组)

  • 使用
    fork()
    创建的固定数量的子进程,需要对父进程创建的结构(或数组)进行读/写访问

我不知道如何使变量
myStruct
在进程之间共享


我尝试使用SysV IPC函数来解决这个问题,比如
shmget()
shmat()
,等等。。。为了在共享内存中分配变量,但我不知道如何使用void内存指针将值读/写到myStruct中

理想情况下,我希望能够在每个进程中使用点表示法
(myStruct.node)->attribute=value
,而不必处理指针,因为我不知道我的结构是如何组织到内存中的

可能吗?你们中的一些人能帮忙吗?非常感谢您的帮助


进一步说明:我知道使用线程、管道、套接字或类似的东西会容易得多,但这项工作是出于学术目的,因此我必须模拟多个独立进程的存在。

跨分支共享内存的最简单方法是使用
mmap()
ed内存区域。如果使用匿名
mmap()
(MAP\u ANON和MAP\u SHARED)来存储结构(数组,无论什么),而不是
malloc()
ed内存,它将由子进程共享。

如果创建共享匿名映射,则:

p = mmap(NULL, length, PROT_READ|PROT_WRITE, MAP_SHARED|MAP_ANONYMOUS, -1, 0);
然后,这些页面将不会在写入时复制,而是由所有分叉进程共享

请注意,在锁定时必须小心。如果(且仅当!)使用并将其标记为进程间共享,则可以在进程间共享内存段上使用标准pthread互斥体和condvar


还要注意的是,这项技术映射了一个固定大小的竞技场,并且必须在分叉之前完成。如何在
p
管理内存内容取决于您。创建一个可调整大小的共享内存竞技场是非常重要的;如果你想走这条路,我建议你再问第二个问题,因为可能需要不同的方法。

void*
指针转换为指向你的结构的指针,然后直接使用它,有什么问题吗。它与malloc()返回的指针没有太大区别。不过,您必须使用信号量同步访问。“我不知道如何使用空内存指针将值读/写到myStruct。”--强制转换它们。
MAP\u ANON
在我的mmap(2)副本中被标记为不推荐使用:)@我认为,仅仅是因为人们应该使用
MAP\u ANONYMOUS
。另一种避免这种情况的方法是首先使用
shm_open
获取文件描述符,然后使用该描述符执行
mmap
MAP\u ANON[YMOUS]
不是POSIX指定的,尽管它存在于大多数历史和当前系统中,当您不能确定文件描述符是否可用时,分配匿名页面是必要的。很遗憾POSIX并没有将其标准化。非常感谢您的帮助。我接受了另一个答案,因为它更加详细和准确,但我仍然非常感谢你的帮助。再见!非常感谢你的帮助。我在shm中遇到了大量的分段错误,现在使用mmap,代码是完美的。