【Linux】进程终止与进程等待/僵尸进程与孤儿进程

进程终止:简单来说就是如何退出一个进程

  1. 在main函数中可以直接采用return退出(在普通函数中return只能退出函数而不能退出进程)
  2. 在函数任意位置调用 ==viod exit(int status); ==
    其中,exit是库函数,在退出进程时会刷新缓冲区,将缓冲区中的数据写入文件,status为进程退出的返回值。
  3. 在函数任意位置调用 _exit(int status);
    值得注意的是,_exit是系统调用接口,使用_exit退出进程时会直接释放资源,不会刷新缓冲区。

进程等待:父进程等待子进程退出,获取子进程的返回值,释放子进程的资源

  1. int wait(int *status);
    用于处理退出的子进程,若调用时没有子进程退出,则使父进程阻塞,直到有子进程退出,使用时要添加头文件#include<sys/wait.h>,若成功则返回退出子进程的pid大于0,若失败则返回-1。其中status为输出型参数,用于获取退出子进程的返回值。

  2. int waitpid(int pid,int *status,int option);
    此方法可以用于等待指定的子进程,也可以等待任意一个子进程,通过第一个参数来确定,若pid = -1则表示等待任意子进程,pid = x则表示等待第x个子进程。同时还可以通过第三个参数来设置是否使父进程阻塞,若option = 0 则默认阻塞,option = WNOHANG则默认非阻塞。,若成功则返回退出子进程的pid大于0,没有子进程退出返回0,出错返回-1。

孤儿进程:父进程先于子进程退出,子进程就会变成孤儿进程,被一号进程(init进程)收养,并由一号进程对它们完成状态收集工作,不会产生危害。

僵尸进程:子进程先于父进程退出,父进程没有关注子进程状态,导致子进程资源无法完全释放,产生资源泄漏。

在面对进程终止问题时,我们只有使之变成孤儿进程和僵尸进程两种选择。而其中的僵尸进程会造成资源泄漏的问题,那么应该如何解决这个问题?这个时候就要用到进程等待,让父进程等待子进程的退出,及时释放退出的子进程的资源,避免资源泄漏的产生。

猜你喜欢

转载自blog.csdn.net/weixin_45177279/article/details/114414211