Linux中的fork详解
1、fork与execl
fork是产生一个新的进程,底层原理调用的是系统调用的clone函数,创建了新的PCB(进程控制块),而execl是一个程序替换函数,是将其调用位置之后的程序代码全部替换为目标代码,当前进程的PCB并不会退出
2、fork后,子进程保留了父进程的什么?
子进程保留了父进程的环境变量和当前路径,但是信号相关以及进程号并不会被继承,这些都是进程间独立互不影响的东西
3、pid_t waitpid(pid_t pid, int* status, int options)
pid=0时,表示等待指定的子进程退出;pid=-1时,表示等待任意的子进程退出;第二个参数用来接受退出码,是一个输出型参数;而options,常用的一个选项是WNOHANG,表示父进程在子进程退出以前不处于阻塞状态
waitpid默认是阻塞等待指定进程或者任意进程退出,而使用选项WNOHANG时,父进程不会阻塞,即使最后也没有子进程退出,也不会报错,返回值为0
4、exit与_exit
两者都会让当前进程直接退出,但是在文件缓冲区的处理上有所差别:前者是先刷新文件缓冲区,再退出进程;后者是直接释放所有资源,不刷新文件缓冲区,直接退出
5、fork创建子进程的理解
基于以下代码判断除了主进程,一共创建了多少个进程?
int main()
{
fork();
fork()&&fork()||fork();
fork();
return 0;
}
一共有19个
这里我们对五个fork函数分别编号为1、2、3、4、5(将在n号fork创建的进程都成为pn)
在运行到一号fork时,创建了p1;主进程和p1运行到二号fork时,两者都创建了p2(两个p2);但是这时,主进程和p1可以执行三号fork创建了p3(两个)而两个p2因为二号fork时接受的返回值为0,所以不能执行3号fork;在运行到四号fork的时候,主进程和p1已经不能再执行4号fork,而其他的进程(两个p2和两个p3各创建一个p4);现在已经有了10个进程,他们再在5号fork出各产生一个p5这样总共就有10 * 2 = 20个进程,而我们又不算主进程,所以一共有19个进程被创建。