C编程中的Fork()函数

gyo*_*sko 4 c fork

我只需要理解这句话:

if (fork() && !fork())
Run Code Online (Sandbox Code Playgroud)

不应该总是假的吗?我的意思是,如果我写:

if (a && !a)
Run Code Online (Sandbox Code Playgroud)

它总是假的,所以第一个也应该总是假的,我错了吗?我当然是,但我希望有人可以向我解释这个奇怪的事情.

我正在攻读C考试,我必须解决这个问题:

int main(){
if(fork && !fork()){
   printf("a\n");
}
else printf("b\n");
}
Run Code Online (Sandbox Code Playgroud)

Aft*_*nix 8

每次调用unix进程创建系统调用fork()都会返回两次.首先,它将子节点的PID返回给父节点(调用fork()的进程).其次,它返回0给新创建的孩子.

从手册页:

回报价值

成功时,子进程的PID在父进程中返回,并在子进程中返回0.失败时,在父项中返回-1,不创建子进程,并正确设置errno.

在你的情况下

if (fork() && !fork())
Run Code Online (Sandbox Code Playgroud)

里面的声明if,调用fork两次.那么接下来会发生什么:

A
|----------------B
|                |
|---C            |
|   |            |         
Run Code Online (Sandbox Code Playgroud)

现在第一次调用fork()将在A和B中返回.在A中它将是非零并且在B中它将为零.

对fork()的第二次调用将仅从A中引发,因为第一个fork返回0到B,它不会唤醒第二个fork().因为&&如果发现第一个操作数非零,则会使评估短路.感谢Daniel指出这一点.

所以我们可以制作一个表格:

PID       fork()1      fork()2
------------------------------
A           >0          >0
B           =0          >0
C           >0          =0
Run Code Online (Sandbox Code Playgroud)

因此,从图表中,Process C if将被评估为TRUE

重要的是记住,fork()1没有回到C.它从其父级获得了已经评估的表达式的副本.

我希望这能解释你的问题.


ssh*_*nin 6

首先,是一个功能.它可能并不总是返回相同的值.

在这种情况下,fork是一个创建另一个进程的函数.原始进程获得(孩子的pid)的正返回值,子进程的返回值为0.

在您的代码中,最终总共有三个进程.对于其中1个,if语句将评估为true(下面的过程C).

     A
     |__________B
     |          |
     |__C       |
     |  |       |       
     |  |       |        
Run Code Online (Sandbox Code Playgroud)

  • 只有三个进程,第一个子进程不是`fork()`,因为`&&`是捷径. (3认同)