过去两周我用Google搜索了一下,但我没有得到任何答案。这就是我所拥有的:
父进程,它创建一个结构myStruct
,它基本上是一个使用指针的链表(如果这是一个主要问题,我可以接受使用固定大小的数组)。
使用fork()
创建的固定数量的子进程需要对父进程创建的结构(或数组)进行读/写访问。
我不知道怎么做才能让变量myStruct
在进程之间共享。
我尝试使用SysV IPC函数解决问题,例如shmget()
,shmat()
等...以便在共享内存中分配我的变量,但我不知道如何使用void memory指针将值读入/写入myStruct。
理想情况下,我希望能够在每个进程中使用点符号(myStruct.node)->attribute = value
而无需处理指针,因为我不知道我的结构是如何组织到内存中的。
这可能吗?你们有些人可以帮忙吗?任何帮助都非常感谢。
进一步说明:我知道使用线程,管道,插座或类似的东西会更容易,但这项工作是出于学术目的,我必须模拟多个独立过程的存在。
答案 0 :(得分:2)
如果使用以下命令创建共享匿名映射:
p = mmap(NULL, length, PROT_READ|PROT_WRITE, MAP_SHARED|MAP_ANONYMOUS, -1, 0);
然后这些页面将不被写入复制,而是由所有分叉进程共享。
请注意,您必须小心锁定此处。您可以在进程之间的共享内存段上使用标准pthread互斥锁和condvars,如果(并且仅当!)使用pthread_mutexattr_setpshared
和pthread_condattr_setpshared
将它们标记为进程之间共享。
另请注意,此技术会映射固定大小竞技场,并且必须在分叉之前完成。如何管理p
内存的内容取决于您。创建一个可调整大小的共享内存领域是非常重要的;如果你想走这条路,我建议发布第二个问题,因为可能需要不同的方法。
答案 1 :(得分:0)
在fork中共享内存的最简单方法是使用mmap()
内存区域。如果您使用匿名mmap()
(使用MAP_ANON和MAP_SHARED)来存储结构(数组,无论如何)而不是malloc()
内存,它将由子进程共享。