以下代码会输出几个"A"?
int main()
{
fork() || fork();
printf("A\n");
}
代码分析:
//父进程
fork() || fork();
printf("A\n");
这里父进程中的第一个fork先执行,产生一个子进程:
//子进程1
fork() || fork();
printf("A\n");
这时有两个进程,且两个进程的第一个fork已经执行完了。
在父进程中fork的返回值是大于0的,子进程1中fork的返回值是等于0的。按照期望,如果父进程中的fork()||fork();
是“或”的关系,第一个fork大于0时表达式就已经成立了,那么后边的fork是不执行的,它没有机会执行,所以直接执行printf("A\n");
,输出"A"。
这时,对于子进程1来说,第一个fork已经执行完了,它的返回值是等于0的,对于“或”的关系来说,表达式不成立,就要看“||”的另一边,所以执行子进程1中fork()||fork();
的第二个fork,这个fork执行,就把子进程1复制了一份又产生了一个子进程2:
//子进程2
fork() || fork();
printf("A\n");
这时候,对于子进程1来说fork() || fork();
中的第一个fork的返回值等于0,第二个fork的返回值大于0,表达式成立,执行printf("A\n");
,输出"A"。这时候其实无论第二各fork是否大于0都会执行printf("A\n");
,输出"A"。
在子进程2中,fork() || fork();
两个fork都执行过了,直接执行printf("A\n");
,输出"A"。
运行结果: