以下问题:
我创建了一个共享内存段(在我的 main.c 中),包含多个结构、一些变量等。在那之后,我是 - 创建一个管道,和 -fork()-ing.
我正在让子进程和父进程通过管道进行通信——它们的套接字描述符都存储在一个全局结构中,保存在共享内存段中。 现在我读到,对于包含在共享内存段中的元素,在 fork 之后,两个进程都可以操作共享变量和结构,并且共享内存的另一个进程因此可以访问相同的、被操作的数据。到目前为止,一切顺利!
我的问题不是源代码问题,它更像是我似乎遗漏的理论点,因为我的代码完全按照它应该的方式工作,但我不明白为什么会这样:
fork 后,我让每个进程关闭它无关的(为了我的目的),管道的一侧(例如,父进程关闭管道的读取端,子进程关闭写入端)。但是,pipe_fd[2] 存储在 SHM 段的全局结构中。那么,如果一侧从一个进程关闭,而另一侧从另一个进程关闭(分别通过使用访问
close(nameOfSHMStruct->pipe_fd[0]);
和
close(nameOfSHMStruct->pipe_fd[1]);
), 但两者都从结构中访问它,他们仍然能够相互通信?我是否遗漏了有关 pipe()-statement 的某些信息,或者它是否与 SHM 有关,或者是否与 fork() 有关,或者上帝知道它们的所有 3 个组合?正如我已经说过的,代码实际上是这样工作的,我正在打印(作为调试消息)进程之间交换的数据,但我只是没有真正了解其运作方式背后的核心理论方面......
最佳答案
它们之所以能够通信,是因为它们只关闭了管道的描述符。我会深入解释:
FATHER PROCCESS -----> FORK() ------>>> FATHER PROCESS
pipe() -> pipe_fd[2] | pipe_fd[2] (father pipe fds)
|
----->>> CHILD PROCESS
pipe_fd[2] (child pipe fds)
fork 克隆父进程,包括文件描述符:子进程拥有其父进程的文件描述符副本。所以在 fork 之后,我们将为每个进程提供 2 个文件描述符。
因此,考虑到这一点,您不应将管道文件描述符存储在共享内存结构中,因为它指向父亲和 child 中概念上不同的 fd。
关于c - 在 C 中 fork 后从 SHM 编辑结构中的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21367551/