学习linux:僵尸进程和孤儿进程

本文介绍了操作系统中的两种特殊进程状态——僵尸进程和孤儿进程。僵尸进程是指子进程结束后,父进程未回收其资源,导致子进程变成僵尸状态。而孤儿进程则是指父进程先于子进程退出,子进程会被init进程收养,避免成为僵尸。通过示例代码展示了这两种情况的发生,并提到了处理僵尸进程的方法,如使用wait系列函数。
摘要由CSDN通过智能技术生成

僵尸进程

如果一个子进程终止了,其父进程没有获取它的终止信息、释放它所占用了的资源,则这样的一个子进程就称为僵尸进程(或者僵死进程)

一个栗子:

// process.cc
#include <chrono>
#include <thread>
#include <iostream>

#include <unistd.h> // fork()

int main()
{
  pid_t p_id = fork();

  // 子进程
  if (p_id == 0) {
    std::cout << "this is child process" << std::endl;
    return 0;
  }

  // 父进程
  std::cout << "child process id: " << p_id << std::endl;
  // wait(nullptr);
  std::this_thread::sleep_for(std::chrono::seconds(10));
  return 0;
}

编译运行查看进程状态

g++ process.cc -std=c++11 -o main

./main &

ps -l

在注释了wait(nullptr)时,可以看到第四行为第三行的子进程,其状态为ZN:
在这里插入图片描述

取消注释之后:
在这里插入图片描述
除了wait函数还有waitpid、waitid、wait3、wait4函数,感兴趣可以自行Google。

孤儿进程

如果一个子进程的父进程在其之前消亡,则其就为一个孤儿进程,将被init进程收养,不会变为僵尸进程。

一个栗子:

#include <chrono>
#include <thread>
#include <iostream>

#include <unistd.h> // fork()

int main()
{
  pid_t p_id = fork();

  // 子进程
  if (p_id == 0) {
    std::cout << "this is child process" << std::endl;
    std::this_thread::sleep_for(std::chrono::seconds(10));
    return 0;
  }

  // 父进程
  std::cout << "child process id: " << p_id << std::endl;
  return 0;
}

g++ process.cc -std=c++11 -o main
./main&
ps -l

可以看到父进程退出之后,子进程休眠10s,子进程的PPID已经变为1,被init进程收养。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值