首页 文章

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

提问于
浏览
4

过去两周我用Google搜索了这个,我没有得到任何答案 . 这就是我所拥有的:

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

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

我不知道怎么做才能使变量 myStruct 在进程之间共享 .

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

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

那可能吗?有人可以帮忙吗?任何帮助真的很感激 .

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

2 回答

  • 0

    如果您创建共享匿名映射:

    p = mmap(NULL, length, PROT_READ|PROT_WRITE, MAP_SHARED|MAP_ANONYMOUS, -1, 0);
    

    然后这些页面不会被写入复制,而是由所有分叉进程共享 .

    请注意,您必须小心锁定此处 . 如果(并且仅当!)使用pthread_mutexattr_setpsharedpthread_condattr_setpshared将它们标记为进程之间共享,则可以在进程之间的共享内存段上使用标准pthread互斥锁和condvar .

    另请注意,此技术会映射固定大小的舞台,并且必须在分叉之前完成 . 如何在 p 管理内存的内容取决于你 . 它建议发布第二个问题,因为可能需要采用不同的方法 .

  • 2

    跨fork共享内存的最简单方法是使用内存区域 . 如果您使用匿名 mmap() (使用MAP_ANON和MAP_SHARED)来存储您的struct(数组,无论如何)而不是 malloc() ed内存,它将由子进程共享 .

相关问题