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,代码是完美的。