我只需要理解这句话:
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)
每次调用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.它从其父级获得了已经评估的表达式的副本.
我希望这能解释你的问题.
首先,是一个功能.它可能并不总是返回相同的值.
在这种情况下,fork是一个创建另一个进程的函数.原始进程获得(孩子的pid)的正返回值,子进程的返回值为0.
在您的代码中,最终总共有三个进程.对于其中1个,if语句将评估为true(下面的过程C).
A
|__________B
| |
|__C |
| | |
| | |
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9450 次 |
| 最近记录: |