先来看fork() || fork() || fork()
#include<stdio.h>
#include<unistd.h>
#include<assert.h>
int main()
{
fork() || fork() || fork();
printf("A\n");
}
//这个输出多少个A呢
首先主进程 fork() || fork() || fork();
最左边的fork()给个返回值 这个返回值是子进程的进程ID 这个ID具体不重要 反正大于零
然后根据 "||" 这个的原则 右边两个fork()不执行
到了第一个子进程之后 第一个fork()的返回值(也就是子进程ID)是等于零的 打印一个A
然后第二个子进程 fork() || fork() || fork(); 执行第二个fork() , 打印一个A
执行之后 到了第三个子进程 第一个第二个fork()返回值都是零
到 fork() || fork() || fork();
这个fork()之后 三个fork()返回值都变成了0 程序结束
再加上父进程中的一个A
父进程----->子进程------->子进程------>子进程
所以总共打印四个A
再来看这个: fork() && fork() && fork()
#include<stdio.h>
#include<unistd.h>
#include<assert.h>
int main()
{
fork() && fork() && fork();
printf("A\n");
}
//这个输出多少个A呢
这个其实比fork() || fork() || fork(); 要简单些 因为"&&"要想通过 必须全部大于零
相当于主进程一下复制了三份 家伙是那个父进程 总共四个进程 打印四个A
“&&”因为这个的特性 所以到了子进程中子进程的进程ID等于零 所以子进程不能再进行复制了