为什么这个程序打印4次“forked!”?
#include <stdio.h>
#include <unistd.h>
int main(void) {
fork() && (fork() || fork());
printf("forked!\n");
return 0;
}
发布于 2014-11-03 22:46:24
第一个fork()
在调用进程中返回一个非零值(称为p0),在子进程中返回0(称为p1)。
在p1中,使用&&
的短路,进程调用printf
并终止。在p0中,进程必须计算表达式的其余部分。然后它再次调用fork()
,从而创建一个新的子进程(p2)。
在p0中,fork()
返回一个非零值,||
的短路被采用,因此该进程调用printf
并终止。
在p2中,fork()
返回0,因此必须计算||的剩余部分,这是最后一个fork()
;这导致为p2创建一个子级(称为p3)。
然后,P2执行printf
并终止。
然后,P3执行printf
并终止。
然后执行4个printf
。
发布于 2014-11-04 06:18:52
我喜欢所有已经提交的答案。如果您在printf语句中多添加几个变量,您可能会更容易看到发生了什么。
#include<stdio.h>
#include<unistd.h>
int main(){
long child = fork() && (fork() || fork());
printf("forked! PID=%ld Child=%ld\n", getpid(), child);
return 0;
}
在我的机器上,它生成了以下输出:
forked! PID=3694 Child = 0
forked! PID=3696 Child = 0
forked! PID=3693 Child = 1
forked! PID=3695 Child = 1
发布于 2012-12-02 02:17:19
这段代码:
fork();
fork() && fork() || fork();
fork();
为自己获取20个进程,而Printf将执行20次。
和用于
fork() && fork() || fork();
printf将总共执行5次。
https://stackoverflow.com/questions/26716255
复制相似问题