我试图理解前面给出的一行代码的执行顺序和使用fork()
系统调用创建进程。它是用C语言在UNIX上运行的。
我理解fork()
背后的主要概念,但是,我想了解从以下代码行派生的进程树创建:
x = fork() || !fork();
任何帮助将不胜感激!
答案 0 :(得分:4)
运行代码的初始父进程(假设它是PID = 1000
)执行x = fork()
部分,并生成一个新的子进程(假设为PID = 1001
)。
对于流程PID = 1000
,到目前为止逻辑表达式的值不为零,因为fork(2)
返回其子项pid
。因此,由于short circuit evaluation,逻辑表达式的其余部分未被评估,因为它不需要。
对于流程PID = 1001
,到目前为止逻辑表达式的值为0
,因为在创建新流程的情况下,fork(2)
会返回0
;所以它必须评估逻辑表达式的其余部分。它执行!fork()
部分,产生一个新进程(假设为PID = 1002
)。
派生的过程树如下:
1000
|
|
1001
|
|
1002
答案 1 :(得分:1)
chrk's answer很棒,另外,fork()
返回2次,一次是父进程中子进程的pid,另一种是从子进程返回的0。在fork()
返回后,这两个进程都会继续处理。