fork函数、孤儿进程和僵尸进程

fork函数、孤儿进程和僵尸进程

fork函数

fork是操作系统在创建新进程时会用到的函数,当一个进程调用fork时,它会被认为是父进程,新创建的进程是它的子进程;

具体的调用过程

当一个进程调用fork的时候,该函数虽然被调用了一次,但是返回两次,分别是返回父进程新创建的子进程的进程ID,和返回子进程一个0值,因此成功fork之后,操作系统会复制一个与父进程完全相同的子进程,这两个进程共享
代码空间,但是数据空间是独立的,子进程的数据空间的内容是父进程的完全拷贝;

  • 返回给父进程新进程的ID是因为,一个父进程的子进程可以多于1个 ;
  • 返回给子进程0是因为子进程有时需要获取自己的pid或者父进程的pid,进程id 0 是用来交换进程使用,一个子进程的id不可能为0;

孤儿进程和僵尸进程原因

当父进程调用fork函数创建了一个子进程之后,父进程和子进程之间的运行是异步的,这就导致了父进程不知道子进程的运行状态信息,因此父进程和子进程的结束是不确定的;

孤儿进程

如果父进程提前结束,子进程就变成了孤儿进程,当内核发现出现了孤儿进程,那么就会把init进程设置成它的父进程,init进程会不停的循环调用wait来获取子进程的状态信息,并及时的对已经结束的子进程的id,状态进行回收。
父进程调用wait函数会一直阻塞,直到收到一个子进程退出的sigchld信号,之后wait函数会销毁子进程并返回,如果成功返回收集的子进程进程id,如果没有子进程会调用失败返回-1;
waitpid函数的作用和wait相同但是多了用户控制的参数id,仅仅等待被指定的子进程;,如果设置pid为1,则和wait相同;

僵尸进程

如果父进程没有提前结束,子进程提前结束,但是父进程没有调用wait获取它的子进程的状态,就会导致已经结束的子进程的状态和进程号一直存在系统中。这样的进程就称为僵尸进程。
僵尸进程的危害就是如果系统中出现了大量的僵尸进程,就会导致新进程无法继续创建,因此为了避免这个问题,需要提醒父进程及时的调用wait函数。


fork函数、孤儿进程和僵尸进程
https://zhyyao.me/2023/06/11/system/process_control/
作者
zhyyao
发布于
2023年6月11日
许可协议