c - 更好地识别孩子
问题描述
我试图创建一个僵尸进程,使用ps
命令进行验证。虽然解决方案很好,但对于将孩子识别为僵尸来说并不是很有启发性。任何人都可以帮助我进行一些改进吗?
这是我的代码:
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
int pid=fork();
if (pid>0)
{
printf("in parent process");
sleep(30);
execlp("ps","ps",NULL);
}
else if (pid==0)
{
printf("in child process");
}
return 0;
}
解决方案
僵尸进程不代表任何东西,只是它的父进程尚未wait(2)
编辑的死进程。它的存在只是为内核提供一种将其记帐详细信息(例如花费的 cpu 时间或退出代码)传递回其父进程的方法,以使wait(2)
系统调用可靠。
没有别的了,根据操作系统的不同,您甚至无法获取用于调用它的命令行参数,或者它所代表的进程的名称。
对于僵尸进程,您唯一能做的就是让其父进程为它做事wait(2)
,因此,将会计详细信息、退出代码和其他信息传递给它的父进程。没有分配内存,没有专用或锁定的系统资源,它的所有文件描述符都已关闭,只有它的 pid、进程组 ID、会话 ID 以及累积的系统和用户空间 cpu 时间(对于它,以及其子进程的累加)存储在进程表中,因此wait(2)
系统调用也可以在父进程exit(2)
s或wait(2)
s为它时对其进行累加。
正如您可能已经检测到的那样,您不能kill(2)
成为僵尸进程(好吧,您确实可以是kill(2)
它的父进程,因此它将永远安息——和父进程),因为它已经死了。
为了更好地识别进程,您必须在父进程中收集该信息(父进程在wait(2)
系统调用系列中接收所有信息)您将获得pid_t
进程 ID,因此您将知道哪个您的子进程是您的子进程wait(2)
。当你(父母)创建它时,你会知道你需要了解你的孩子的一切(你在fork(2)
创建它时从系统调用中获得了这个 pid)
推荐阅读
- amazon-web-services - 如何为 EKS 创建具有 VPC 链接集成的 API?
- delphi - 类似名称的资源字符串和常量之间的冲突
- git - gitignore 不尊重 Django 设置 __init__.py
- api - 标头丢失或无效 - 失眠错误(400 状态代码)
- iis - 附加到进程 w3wp.exe 不适用于经典 asp 页面
- vue.js - Vue 过渡组 - 如何防止“跳跃”?
- powershell - 在 powershell 中修剪输出或剪切特定数量的字母
- python-3.x - 无法通过从谷歌云控制台启动的实例在 Jupiter 上创建新笔记本
- python - 是否可以在 SBATCH 进程之间使用共享变量?
- sql - 从复合主键的元素创建外键