《UNIX环境高级编程》笔记--孤儿进程组

2024-04-14 21:58

本文主要是介绍《UNIX环境高级编程》笔记--孤儿进程组,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

POSIX.1将孤儿进程组定义为:该组中每个成员的父进程要么是该组的一个成员,要么不是该组所属会话的成员。一个进程组

不是孤儿进程组的条件是:该组中有一个进程,其父进程在属于同一会话中的另一个组中。

下面对孤儿进程组的产生进行检验:

1.在一个具有作业控制的shell中,执行一个程序,该程序fork了一个子进程,其进程结构如下:


2.父进程休眠5秒钟,这是一种让子进程在父进程终止前运行的一种权宜之计。

3.子进程为挂断信号(SIGHUP)建立信号处理程序。这样就能观察到SIGHUP信号是否已发送到子进程。

4.子进程用kill函数向其自身发送停止信号(SIGTSTP)。这停止了子进程,类似于用终端挂起字符(ctrl+z)停止了一个前台作业。

5.当父进程终止时,该子进程成为了孤儿进程,所以其符进程成为1,也就是init进程ID。同时子进程成为了一个孤儿组的成员。

6.在父进程终止后,进程组成为孤儿进程组,POSIX.1要求向新的孤儿进程组中处于停止状态的每一个进程发送挂断信号

(SIGHUP),接着又向其发送继续信号(SIGCONT)。


程序:

#include <stdio.h>
#include <errno.h>
#include <unistd.h>
#include <signal.h>
#include <stdlib.h>static void sig_hup(int signo){printf("SIGHUP revevied, pid=%d\n",getpid());
}static void pr_ids(char *name){printf("%s:pid=%d,ppid=%d,pgrp=%d,tpgrp=%d\n",name,getpid(),getppid(),getpgrp(),tcgetpgrp(STDIN_FILENO));fflush(stdout);
}int main(void){char c;pid_t pid;pr_ids("parent");if((pid=fork())<0){perror("fork");return -1;}else if(pid > 0){sleep(5);exit(0);}else{pr_ids("child");signal(SIGHUP,sig_hup);kill(getpid(),SIGTSTP);pr_ids("child");if(read(STDIN_FILENO,&c,1) != 1){printf("read error from controlling tty, errno=%d\n",errno);}exit(0);}return 0;
}
运行结果:

yan@yan-vm:~/apue$ ./a.out
parent:pid=9154,ppid=9066,pgrp=9154,tpgrp=9154
child:pid=9155,ppid=9154,pgrp=9154,tpgrp=9154
yan@yan-vm:~/apue$ SIGHUP revevied, pid=9155
child:pid=9155,ppid=1,pgrp=9154,tpgrp=9066
read error from controlling tty, errno=5

一开始父进程和子进程在同一个进程组,父进程是前台进程组的首进程,所以前台进程组的进程组ID是父进程组ID。

子进程向自己发送了SIGTSTP信号,所以进程停止,当父进程结束后,子进程称为了孤儿进程,子进程所在的进程组称为了孤儿

进程组,POSIX.1要求向新的孤儿进程组中处于停止状态的每一个进程发送挂断信号(SIGHUP),所以子进程显示接受到了

SIGHUP信号,然后又接收到了继续信号(SIGCONT),子进程继续运行,然后打印了他的进程信息,此时父进程变成了1.

最后调用read,posix规定,在这种情况下,read返回错,并将errno设置为5(EIO)。

要注意的是,父进程终止时,子进程被置入后台进程组中,因为父进程是由shell作为前台作业执行的。

这篇关于《UNIX环境高级编程》笔记--孤儿进程组的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/904125

相关文章

IntelliJ IDEA 中配置 Spring MVC 环境的详细步骤及问题解决

《IntelliJIDEA中配置SpringMVC环境的详细步骤及问题解决》:本文主要介绍IntelliJIDEA中配置SpringMVC环境的详细步骤及问题解决,本文分步骤结合实例给大... 目录步骤 1:创建 Maven Web 项目步骤 2:添加 Spring MVC 依赖1、保存后执行2、将新的依赖

Spring Boot 整合 SSE的高级实践(Server-Sent Events)

《SpringBoot整合SSE的高级实践(Server-SentEvents)》SSE(Server-SentEvents)是一种基于HTTP协议的单向通信机制,允许服务器向浏览器持续发送实... 目录1、简述2、Spring Boot 中的SSE实现2.1 添加依赖2.2 实现后端接口2.3 配置超时时

Python如何精准判断某个进程是否在运行

《Python如何精准判断某个进程是否在运行》这篇文章主要为大家详细介绍了Python如何精准判断某个进程是否在运行,本文为大家整理了3种方法并进行了对比,有需要的小伙伴可以跟随小编一起学习一下... 目录一、为什么需要判断进程是否存在二、方法1:用psutil库(推荐)三、方法2:用os.system调用

mysql中的group by高级用法

《mysql中的groupby高级用法》MySQL中的GROUPBY是数据聚合分析的核心功能,主要用于将结果集按指定列分组,并结合聚合函数进行统计计算,下面给大家介绍mysql中的groupby用法... 目录一、基本语法与核心功能二、基础用法示例1. 单列分组统计2. 多列组合分组3. 与WHERE结合使

Java程序进程起来了但是不打印日志的原因分析

《Java程序进程起来了但是不打印日志的原因分析》:本文主要介绍Java程序进程起来了但是不打印日志的原因分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java程序进程起来了但是不打印日志的原因1、日志配置问题2、日志文件权限问题3、日志文件路径问题4、程序

Python如何自动生成环境依赖包requirements

《Python如何自动生成环境依赖包requirements》:本文主要介绍Python如何自动生成环境依赖包requirements问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑... 目录生成当前 python 环境 安装的所有依赖包1、命令2、常见问题只生成当前 项目 的所有依赖包1、

shell编程之函数与数组的使用详解

《shell编程之函数与数组的使用详解》:本文主要介绍shell编程之函数与数组的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录shell函数函数的用法俩个数求和系统资源监控并报警函数函数变量的作用范围函数的参数递归函数shell数组获取数组的长度读取某下的

MySQL高级查询之JOIN、子查询、窗口函数实际案例

《MySQL高级查询之JOIN、子查询、窗口函数实际案例》:本文主要介绍MySQL高级查询之JOIN、子查询、窗口函数实际案例的相关资料,JOIN用于多表关联查询,子查询用于数据筛选和过滤,窗口函... 目录前言1. JOIN(连接查询)1.1 内连接(INNER JOIN)1.2 左连接(LEFT JOI

Redis在windows环境下如何启动

《Redis在windows环境下如何启动》:本文主要介绍Redis在windows环境下如何启动的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Redis在Windows环境下启动1.在redis的安装目录下2.输入·redis-server.exe

Pytest多环境切换的常见方法介绍

《Pytest多环境切换的常见方法介绍》Pytest作为自动化测试的主力框架,如何实现本地、测试、预发、生产环境的灵活切换,本文总结了通过pytest框架实现自由环境切换的几种方法,大家可以根据需要进... 目录1.pytest-base-url2.hooks函数3.yml和fixture结论你是否也遇到过