《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

相关文章

Java汇编源码如何查看环境搭建

《Java汇编源码如何查看环境搭建》:本文主要介绍如何在IntelliJIDEA开发环境中搭建字节码和汇编环境,以便更好地进行代码调优和JVM学习,首先,介绍了如何配置IntelliJIDEA以方... 目录一、简介二、在IDEA开发环境中搭建汇编环境2.1 在IDEA中搭建字节码查看环境2.1.1 搭建步

在 VSCode 中配置 C++ 开发环境的详细教程

《在VSCode中配置C++开发环境的详细教程》本文详细介绍了如何在VisualStudioCode(VSCode)中配置C++开发环境,包括安装必要的工具、配置编译器、设置调试环境等步骤,通... 目录如何在 VSCode 中配置 C++ 开发环境:详细教程1. 什么是 VSCode?2. 安装 VSCo

Python中列表的高级索引技巧分享

《Python中列表的高级索引技巧分享》列表是Python中最常用的数据结构之一,它允许你存储多个元素,并且可以通过索引来访问这些元素,本文将带你深入了解Python列表的高级索引技巧,希望对... 目录1.基本索引2.切片3.负数索引切片4.步长5.多维列表6.列表解析7.切片赋值8.删除元素9.反转列表

正则表达式高级应用与性能优化记录

《正则表达式高级应用与性能优化记录》本文介绍了正则表达式的高级应用和性能优化技巧,包括文本拆分、合并、XML/HTML解析、数据分析、以及性能优化方法,通过这些技巧,可以更高效地利用正则表达式进行复杂... 目录第6章:正则表达式的高级应用6.1 模式匹配与文本处理6.1.1 文本拆分6.1.2 文本合并6

C#如何优雅地取消进程的执行之Cancellation详解

《C#如何优雅地取消进程的执行之Cancellation详解》本文介绍了.NET框架中的取消协作模型,包括CancellationToken的使用、取消请求的发送和接收、以及如何处理取消事件... 目录概述与取消线程相关的类型代码举例操作取消vs对象取消监听并响应取消请求轮询监听通过回调注册进行监听使用Wa

C#反射编程之GetConstructor()方法解读

《C#反射编程之GetConstructor()方法解读》C#中Type类的GetConstructor()方法用于获取指定类型的构造函数,该方法有多个重载版本,可以根据不同的参数获取不同特性的构造函... 目录C# GetConstructor()方法有4个重载以GetConstructor(Type[]

鸿蒙开发搭建flutter适配的开发环境

《鸿蒙开发搭建flutter适配的开发环境》文章详细介绍了在Windows系统上如何创建和运行鸿蒙Flutter项目,包括使用flutterdoctor检测环境、创建项目、编译HAP包以及在真机上运... 目录环境搭建创建运行项目打包项目总结环境搭建1.安装 DevEco Studio NEXT IDE

阿里开源语音识别SenseVoiceWindows环境部署

SenseVoice介绍 SenseVoice 专注于高精度多语言语音识别、情感辨识和音频事件检测多语言识别: 采用超过 40 万小时数据训练,支持超过 50 种语言,识别效果上优于 Whisper 模型。富文本识别:具备优秀的情感识别,能够在测试数据上达到和超过目前最佳情感识别模型的效果。支持声音事件检测能力,支持音乐、掌声、笑声、哭声、咳嗽、喷嚏等多种常见人机交互事件进行检测。高效推

Linux 网络编程 --- 应用层

一、自定义协议和序列化反序列化 代码: 序列化反序列化实现网络版本计算器 二、HTTP协议 1、谈两个简单的预备知识 https://www.baidu.com/ --- 域名 --- 域名解析 --- IP地址 http的端口号为80端口,https的端口号为443 url为统一资源定位符。CSDNhttps://mp.csdn.net/mp_blog/creation/editor

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal