Content
0.fork函数原型
1. fork函数描述
2. 关于fork函数用法的总结
3. 小结
0. fork函数原型
#include <unistd.h>
pid_t fork(void);
1. fork函数描述
一个现有的进程可以调用fork函数创建一个新进程;
fork函数调用一次,但返回两次,返回值:子进程中返回0,父进程中返回子进程ID,出错返回-1;
子进程和父进程继续执行fork之后的指令。子进程是父进程的副本,子进程获取父进程的数据空间、堆和栈的副本;
2. 关于fork函数用法的总结
例1:
#include <stdio.h>
#include <unistd.h>
int main(int argc, char *argv[])
{
printf("a");
fork();
return 0;
}
运行结果:aa
分析:按照fork函数调用后,子进程和父进程继续执行fork之后的指令来说,输出结果应该是1个a。出现这样的结果是因为printf函数的缓冲是行缓冲,也就是说父进程在执行了printf("a")后,字符串a依然在缓冲区中,而子进程在exit()退出时,会刷新缓冲区,所以会打印两个a。
例2:下面的程序会生成多少个子进程
#include <stdio.h>
#include <unistd.h>
int main(int argc, char *argv[])
{
fork();
fork() && fork()|| fork();
fork();
return 0;
}
第一个fork执行后,有2个进程,一个父进程,一个子进程;
fork() && fork() || fork()分如下情况,设第一个fork为cond1,第二个fork为cond2,第三个fork为cond3
那么
1、cond1为假,那么就不判断cond2,直接执行cond3
2、cond1为真,分如下情况
cond2为真,不判断cond3
cond2为假,判断cond3
一共生成4个子进程
综合得出:
第一行fork生成一个子进程
第二行fork生成4x2=8个子进程
第三行fork生成(8+2)*2-1=19个子进程
例3:循环fork
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
int main(int argc, char *argv)
{
int i;
for (i = 0; i < 2; i++)
{
fork();
printf("a\n");
}
wait(NULL);
wait(NULL);
return 0;
}
运行结果:6个a
分析:循环两次,父进程生成两个子进程,有一个子进程会生成一个孙子进程,所以一共新创建3个子进程