【IPC 通信】信号处理接口 Signal API(7)

         收发信号思想是 Linux 程序设计特性之一,一个信号可以认为是一种软中断,通过用来向进程通知异步事件。

        本文讲述的 信号处理内容源自 Linux man。本文主要对各 API 进行详细介绍,从而更好的理解信号编程。


exit(5)

遵循 C11, POSIX.1 - 2008

1.库

标准 c 库,libc, -lc

2.接口定义

       #include <stdlib.h>[[noreturn]] void exit(int status);

3.接口描述

        exit() 函数会导致普通程序终止并将 status 的低字节返回给父进程。

        通过 atexit(3) 和 on_exit(3) 注册的所有函数都会被调到,顺序和注册顺序相反。如果这些函数中有函数没有返回(比如调用了 _exit(2) 或者使用信号杀死了自己),那么剩下的函数都不会调用,剩下的退出过程也会跳过(比如刷新 stdio(3) 流等)。如果一个函数通过上面方式注册了多次,那么每次都会被调用。

        所有打开的 stdio(3) 流都会被刷新并关闭。通过 tmpfile(3) 创建的文件会被删除。

        C 标准规定了两个常量,EXIT_SUCCESS 和 EXIT_FAILURE,可以用来传递给 exit() 指示成功还是失败。        

4.返回值

        exit() 函数不会返回。

5. 属性

        

接口属性
exit()线程安全MT-Unsafe race:exit

        exit() 不是线程安全的,会引起数据竞争问题,关于数据可以参考 attributes(7),在前几篇文章中也有介绍。

 6.注意

        如果通过 atexit(3) 或者 on_exit(3) 注册的函数调用 exit() 或者 longjmp(3),那么产生的行为是未定义的。值得注意的是,调用 execve(2) 会移除通过 atexit(2) 和 on_exit(3) 注册的函数。

        使用 EXIT_SUCCESS 和 EXIT_FAILURE 比用 0 或者非零值(1 或 -1)更具有移植性,尤其是 VMS 会使用不一样的使用习惯。

        BSD 尝试标准化了退出码(GNU C 库已经采用了),可以参考 <sysexits.h>。

        exit() 调用后,退出状态必须传递给父进程。主要有三种情况:

  • 如果父进程设置 SA_NOCLDWAIT 或者设置了 SIGCHLD 的处置函数为 SIG_IGN,那么状态会被忽略,子进程立即死掉
  • 如果父进程正在等待子进程,那么父进程会得到这个退出状态,子进程立即死掉
  • 否则,子进程变成僵尸进程:子进程的大多数资源被回收了,但是系统进程表中的进程槽会保留,来存储一小部分进程信息。这样主要是等待后面父进程通过 waitpid(2)(或者其他函数)来获得子进程的退出信息,那时僵尸进程槽会被释放。

        如果系统实现支持 SIGCHLD 信号,这时会发送这个信号给父进程。如果父进程设置了 SA_NOCLDWAIT,那么是否发送 SIGCHLD 并未定义。

发送给其他进程信号

         如果退出进程是会话 leader 并且其终端正控制着会话,那么每个前台进程组中的进程都会收到 SIGHUP 信号,该终端会从会话上拿掉,允许其他新的控制进程获取该控制权。

         如果退出进程导致一个进程组成为孤儿,并且新产生的孤儿进程组每个进程都停止了,那么会在 SIGCONT 信号后再跟上一个 SIGHUP 信号给进程组中的每个进程。参考 setpgid(2) 来查看关于孤儿进程组的解释。

         除了以上情况,如果要发送的信号是发给要终止进程的子进程的,那么通常情况下是不会向子进程发送信号的。然而进程却可以使用 prctl(2) PR_SET_PDEATHSIG 操作来安全如何处理父进程终止时受到的信号。

8.代码

         下面程序演示了 fork(2) 和 waitpid() 的用法。程序创建了一个子进程,如果没有提供命令行参数,那么子进程会使用 pause(2) 来停止,允许用户向其发送信号。否则如果指定了命令行参数,那么子进程立即返回,使用命令行提供的整数作为返回状态值。父进程循环执行,通过 waitpid() 来监视子进程,使用 W*() 宏来分析返回的状态值。

        下面 shell 会话演示了程序的使用:

           $ ./a.out &Child PID is 32360[1] 32359$ kill -STOP 32360stopped by signal 19$ kill -CONT 32360continued$ kill -TERM 32360killed by signal 15[1]+  Done                    ./a.out$

        下面是程序源码: 

       #include <stdint.h>#include <stdio.h>#include <stdlib.h>#include <sys/wait.h>#include <unistd.h>intmain(int argc, char *argv[]){int    wstatus;pid_t  cpid, w;cpid = fork();if (cpid == -1) {perror("fork");exit(EXIT_FAILURE);}if (cpid == 0) {            /* Code executed by child */printf("Child PID is %jd\n", (intmax_t) getpid());if (argc == 1)pause();                    /* Wait for signals */_exit(atoi(argv[1]));} else {                    /* Code executed by parent */do {w = waitpid(cpid, &wstatus, WUNTRACED | WCONTINUED);if (w == -1) {perror("waitpid");exit(EXIT_FAILURE);}if (WIFEXITED(wstatus)) {printf("exited, status=%d\n", WEXITSTATUS(wstatus));} else if (WIFSIGNALED(wstatus)) {printf("killed by signal %d\n", WTERMSIG(wstatus));} else if (WIFSTOPPED(wstatus)) {printf("stopped by signal %d\n", WSTOPSIG(wstatus));} else if (WIFCONTINUED(wstatus)) {printf("continued\n");}} while (!WIFEXITED(wstatus) && !WIFSIGNALED(wstatus));exit(EXIT_SUCCESS);}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/145658.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

35 LRU缓存

LRU缓存 题解1 双map&#xff08;差2个testcases&#xff09;题解2 哈希表双向链表&#xff08;参考&#xff09;题解3 STL:listunordered_map 请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。 实现 LRUCache 类&#xff1a; LRUCache(int capacity) 以 正…

无人直播间

失败&#xff01;&#xff01; 采用 ffmpeg 技术进行推流 推流代码&#xff1a; 【需要将rtmp替换为你的推流地址】 ffmpeg -re -stream_loop -1 -i "rain.mp4" -c copy -f flv ""推流地址获取 以哔哩哔哩为例 点击下方链接 开播设置 - 个人中心 - …

CCF CSP认证 历年题目自练Day17

CCF CSP认证 历年题目自练Day17 题目一 试题编号&#xff1a; 201803-1 试题名称&#xff1a; 跳一跳 时间限制&#xff1a; 1.0s 内存限制&#xff1a; 256.0MB 问题描述&#xff1a; 问题描述   近来&#xff0c;跳一跳这款小游戏风靡全国&#xff0c;受到不少玩家的喜爱…

小黑子的java项目开发理解

小黑子的理解 一、基于Maven模板构建的三种常见Java项目——基于maven二、通常的java目录结构utils层 工具包model层&#xff08;pojo层&#xff09;exceptions层 报错包dao层&#xff08;mapper层&#xff09;[impl包—查询数据库]service层 定义接口 [impl—实现事务]control…

Backblaze发布2023中期SSD故障数据质量报告

作为一家在2021年在美国纳斯达克上市的云端备份公司&#xff0c;Backblaze一直保持着对外定期发布HDD和SSD的故障率稳定性质量报告&#xff0c;给大家提供了一份真实应用场景下的稳定性分析参考数据。 本文我们主要看下Backblaze最新发布的2023中期SSD相关故障稳定性数据报告。…

施耐德电气:勾勒未来工业愿景,赋能中国市场

9月19日&#xff0c;第23届中国国际工业博览会&#xff08;简称“工博会”&#xff09;在上海隆重召开。作为全球能源管理和自动化领域的数字化转型专家&#xff0c;施耐德电气在工博会现场全方位展现了自身对未来工业的全新视野与深刻见解&#xff0c;不仅展示了其贯通企业设计…

ubuntu 18.04安装libjasper-dev 亲测可行

情况&#xff1a; ubuntu 18.04 LTS安装OpenCV 3.4.16之前&#xff0c;需要安装几个依赖项&#xff1a; sudo apt-get install build-essential sudo apt-get install cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev sudo apt-get instal…

计算机网络 - 应用层

计算机网络 - 应用层 计算机网络 - 应用层 域名系统文件传送协议动态主机配置协议远程登录协议电子邮件协议 1. SMTP2. POP33. IMAP 常用端口Web 页面请求过程 1. DHCP 配置主机信息2. ARP 解析 MAC 地址3. DNS 解析域名4. HTTP 请求页面 域名系统 DNS 是一个分布式数据库&a…

python -m pip install --upgrade pip失败

显示这样的报错&#xff1a; You are using pip version 9.0.1, however version 23.2.1 is available. You should consider upgrading via the python -m pip install --upgrade pip command. 换源安装 python -m pip install --upgrade pip -i https://pypi.douban.com/s…

基于SpringBoot的服装生产管理系统的设计与实现

目录 前言 一、技术栈 二、系统功能介绍 登录界面的实现 系统主界面的实现 用户管理模块的实现 人事安排管理模块的实现 工资管理模块的实现 考勤管理模块的实现 样板管理模块的实现 三、核心代码 1、登录模块 2、文件上传模块 3、代码封装 前言 本协力服装厂服装生…

TensorFlow-Federated简介与安装

1、简介 TensorFlow Federated&#xff08;TFF&#xff09;是一个用于机器学习和其他分布式数据计算的开源框架。TFF 的开发旨在促进联邦学习 &#xff08;FL&#xff09;的开放研究和实验。联邦学习是一种机器学习方法&#xff0c;其中一个共享的全局模型在许多参与的客户之间…

【GDB】用 python 扩展 gdb

用 python 扩展 GDB .gdbinit 文件中实现自定义命令 mv 代码如下 define mvif $argc 2delete $arg0# 注意新创建的断点编号和被删除断点的编号不同break $arg1elseprint "输入参数数目不对&#xff0c;help mv 以获得用法"end end# (gdb) help mv 会输出以下帮助文…

centos 6使用yum安装软件

1. 执行以下命令&#xff0c;查看当前操作系统 CentOS 版本。 cat /etc/centos-release返回结果如下图所示&#xff0c;则说明当前操作系统版本为 CentOS 6.9。 2. 执行以下命令&#xff0c;编辑 CentOS-Base.repo 和CentOS-Epel.repo文件。 vim /etc/yum.repos.d/CentOS-Bas…

Scrapy-应对反爬虫机制

参考自https://blog.csdn.net/y472360651/article/details/130002898 记得把BanSpider改成自己的项目名&#xff0c;还有一个细节要改一下&#xff0c;把代码user换成user_agent 禁止Cookie 在Scrapy项目中的settings文件&#xff0c;可以发现文件中有以下代码: COOKIES_ENA…

【软件评测】Apowersoft 傲软抠图AI智能换背景工具软件

现如今的数字图像处理已经成为人们生活中不可或缺的一部分&#xff0c;而图像抠图作为其中的重要环节&#xff0c;更是被广泛应用于设计、摄影、广告等领域。为了满足用户的需求&#xff0c;Apowersoft推出了一款傲软抠图AI智能换背景工具&#xff0c;宣称能够自动抠图并智能替…

如何使用ArcGIS Pro制作标准地图样式国界

相信大家都浏览过标准地图服务提供的标准地图&#xff0c;不知道你有没有想过尝试制作里面的国界&#xff0c;这里为大家介绍一下制作方法&#xff0c;希望能对你有所帮助。 制作已定国界 在地图数据内&#xff0c;国界分为已定国界、未定国界和海岸线&#xff0c;我们先对已定…

k8s--storageClass自动创建PV

文章目录 一、storageClass自动创建PV1.1 安装NFS1.2 创建nfs storageClass1.3 测试自动创建pv 一、storageClass自动创建PV 这里使用NFS实现 1.1 安装NFS 安装nfs-server&#xff1a; sh nfs_install.sh /mnt/data03 10.60.41.0/24nfs_install.sh #!/bin/bash### How to i…

overleaf杂谈-Springer文献格式问题

目录 overleaf写作问题记录1.Latex中的%问题&#xff08;文本变成灰色&#xff09;2.Springer文献格式问题2.1 新建reference.bib2.2 谷歌学术搜索文章并引用2.3 复制BibTex2.4 复制进reference.bib2.5 在sn-article.tex的\end{document}前添加语句2.6 引用文献2.7 Springer模板…

docker 安装本地starrocks测试环境

安装文档 Quick start: Deploy StarRocks with Docker deploy_in_docker StarRocks Docs Quick start: Deploy StarRocks with Docker deploy_in_docker StarRocks Docs 镜像版本 https://hub.docker.com/r/starrocks/allin1-ubuntu/tags?page1 docker安装starrocks

最新AI智能写作系统ChatGPT源码/支持GPT4.0+GPT联网提问/支持ai绘画Midjourney+Prompt+MJ以图生图+思维导图生成

一、AI创作系统 SparkAi系统是基于很火的GPT提问进行开发的Ai智能问答系统。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署AI创作ChatGPT系统&#xff1f;小编这里写一个详细图文教程吧&#x…