c - 在 C 中 fork 后从 SHM 编辑结构中的变量

标签 c fork pipe ipc shared-memory

以下问题:

我创建了一个共享内存段(在我的 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。

Herehere更多信息。

关于c - 在 C 中 fork 后从 SHM 编辑结构中的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21367551/

相关文章:

c - 指针赋值和递增在下面的例子中是如何工作的

c - C 中无限循环的不当使用

C 命名管道 (fifo)。父进程卡住

angular - RxJS 管道链接,中间有 IF 语句

c - 快速就地排序字节数组

c - 理解一些汇编语句的目的

c++ - 如何通过shell杀死父进程和子进程?

python - 最多等待 N 秒,让 fork 的子 PID 完成

bash 权限被拒绝 : Can't echo to the stdin of a running process?

windows - 在 64 位 Windows 7 中替换 Vern Buerg 的 list.com