案例1
如下代码一共创建多少个进程(包含主进程)
#include <sys/types.h>
#include <unistd.h>
int main(int argc, char* argv[]) {
fork();
fork() && fork() && fork();
fork() || fork();
return 0;
}
测试一下
加个getchar()
查看进程状态
ps ajx
总共24个。
fork是一个分叉函数。
如果调用成功,父进程返回子进程id,子进程返回0;
如果调用失败,父进程返回-1,没有子进程创建成功。
分析:
总共有三行有fork函数,这里用第一行、第二、第三行表述。
(1)第一行的fork函数将为main函数创建一个子进程,此时总共有2个进程。
(2)第二行的第一个fork函数将为上述的2个进程创建子进程,此时总共4个进程。
(3)由于子进程的返回值是0,所以第二行的第二个fork函数只有2个父进程创建了2个子进程,此时总共有6个进程;第二行第三个fork函数同理,也只有2个父进程创建的子进程,此时总共有8个进程。
(4)第三行的第一个fork函数将为上述8个进程都创建子进程,此时总共有16个进程。
(5)第三行的第二个fork函数中8个父进程将不能创建子进程(||短路特性),而(4)中的8个子进程因为返回值都是0而再创建8个进程,有多了8个进程,此时总共有24个进程。
案例2
for循环中的fork函数。下述代码总共创建多少个进程
#include <sys/types.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
int main()
{
pid_t pid;
int idx = -1;
for (int i = 0; i < 3; i++) {
pid = fork();
}
while (1);
return 0;
}
执行
总共8个
满二叉树的最底层叶子个数。