【发布时间】:2020-08-18 05:34:22
【问题描述】:
有人可以澄清相关和不相关流程的定义吗?
我知道fork会创建两个相关的进程
fork()
但是,当我们调用 exec* 系列函数来替换程序映像时,我不确定该进程是否仍然被认为是相关的:
if (child) {
exec("path to binary", ...) <- Is it still related process
}
我问的原因是要澄清在哪种情况下可以使用哪种 IPC 方法。例如,pipes 只允许在相关进程之间使用。所以我在上面要求澄清我编写的新程序(可能使用不同的语言)是否可以访问管道文件描述符。
我们是否可以说任何使用 fork() 创建的进程,无论是使用 exec 还是使用原始程序映像,始终是相关的,而所有其他进程都是无关的?
谢谢!
ref: mark mitchell: 高级 linux 编程
对管道的调用会创建文件描述符,这些描述符仅在该进程及其所在进程内有效 孩子们。进程的文件描述符不能传递给不相关的进程;然而, 当进程调用fork时,文件描述符被复制到新的子进程中。因此, 管道只能连接相关进程。
【问题讨论】:
-
all others are unrelated?所有进程都是从 PID 1 创建的 => 所有进程都是“相关的” -
调用
fork()会创建一个与原始进程相同的子进程。调用exec()不会改变两个进程之间的关系——子/父关系不受影响。但是,如果父级创建了管道并将它们标记为“执行时关闭”,那么调用exec()的子级将导致管道关闭。
标签: c++ linux pipe ipc systems-programming