您的位置:首页 > 文旅 > 旅游 > 中国互联网协会举报中心_武汉企业网站设计制作_关键词排名推广怎么做_九个关键词感悟中国理念

中国互联网协会举报中心_武汉企业网站设计制作_关键词排名推广怎么做_九个关键词感悟中国理念

2025/1/9 5:56:33 来源:https://blog.csdn.net/m0_73633088/article/details/144949640  浏览:    关键词:中国互联网协会举报中心_武汉企业网站设计制作_关键词排名推广怎么做_九个关键词感悟中国理念
中国互联网协会举报中心_武汉企业网站设计制作_关键词排名推广怎么做_九个关键词感悟中国理念

目录

waitpid等待

进程树

孤儿进程


waitpid等待

 Linux中父进程除了可以启动子进程,还要负责回收子进程的状态。如果子进程结束后父进程没有正常回收,那么子进程就会变成一个僵尸进程——即程序执行完成,但是进程没有完全结束,其内核中PCB结构体(下文介绍)没有释放。在上面的例子中,父进程在子进程结束前就结束了,那么其子进程的回收工作就交给了父进程的父进程的父进程

#include <sys/types.h>
#include <sys/wait.h>/** 等待子进程的终止并获取子进程的退出状态
*    功能简单 没有选择
*/
pid_t wait(int *wstatus);
/*** 功能灵活 可以设置不同的模式 可以等待特定的子进程* * pid: 等待的模式*      (1) 小于-1 例如 -1 * pgid,则等待进程组ID等于pgid的所有进程终止*      (2) 等于-1 会等待任何子进程终止,并返回最先终止的那个子进程的进程ID -> 儿孙都算*      (3) 等于0 等待同一进程组中任何子进程终止(但不包括组领导进程) -> 只算儿子*      (4) 大于0 仅等待指定进程ID的子进程终止* wstatus: 整数指针,子进程返回的状态码会保存到该int* options: 选项的值是以下常量之一或多个的按位或(OR)运算的结果;二进制对应选项,可多选:*      (1) WNOHANG 如果没有子进程终止,也立即返回;用于查看子进程状态而非等待*      (2) WUNTRACED 收到子进程处于收到信号停止的状态,也返回。*      (3) WCONTINUED(自Linux 2.6.10起)如果通过发送SIGCONT信号恢复了一个已停止的子进程,则也返回。* return: (1) 成功等到子进程停止 返回pid*         (2) 没等到并且没有设置WNOHANG 一直等*         (3) 没等到设置WNOHANG 返回0*         (4) 出错返回-1*/
pid_t waitpid(pid_t pid, int *wstatus, int options);/*更加全面的子进程监控和状态报告
*/
int waitid(idtype_t idtype, id_t id, siginfo_t *infop, int options);

示例: 

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>int main(int argc, char const* argv[])
{int state;//子进程的状态printf("当前父进程%d\n", getpid());__pid_t pid = fork();// __pid_t son_pid = fork();if (pid < 0) {perror("fork");return -1;}else if (pid == 0) {char* args[] = { "/usr/bin/ping","-c" ,"50","baidu.com",NULL };char* envs[] = { NULL };printf("子进程%d,执行ping\n",getpid());int re = execve(args[0], args, envs);if (re < 0) {perror("execve");return -1;}}else {printf("父进程%d等待子进程%d\n", getpid(), pid);waitpid(pid, &state, 0);}printf("执行完成\n");return 0;
}

进程树

实质上,1号进程就是systemd,它由内核创建,是第一个进程,负责初始化系统,启动其他所有用户空间的服务和进程。它是所有进程的祖先。

在ps -ef的输出结果中,我们发现,CMD部分有的行带有[],而有的没有,前者属于内核线程,内核线程在内核空间执行,不占用任何用户空间资源,它们在技术上是线程,而在许多方面表现得像独立的进程,因此也会被ps命令检索到。第一个内核线程的pid为2,它是所有其它内核线程的祖先。

  1. pstree -p查看进程树

孤儿进程

孤儿进程(Orphan Process)是指父进程已结束或终止,而它仍在运行的进程。

当父进程结束之前没有等待子进程结束,且父进程先于子进程结束时,那么子进程就会变成孤儿进程。

我们可以得出结论:孤儿进程会被其祖先自动领养。此时的子进程因为和终端切断了联系,所以很难再进行标准输入使其停止了,所以写代码的时候一定要注意避免出现孤儿进程。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com