当前位置: 首页 > news >正文

【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);}}

相关文章:

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

收发信号思想是 Linux 程序设计特性之一&#xff0c;一个信号可以认为是一种软中断&#xff0c;通过用来向进程通知异步事件。 本文讲述的 信号处理内容源自 Linux man。本文主要对各 API 进行详细介绍&#xff0c;从而更好的理解信号编程。 exit(5) 遵循 C11&#xff0c; POSI…...

springboot和vue:十二、VueRouter(动态路由)+导航守卫

VueRouter的简介 VueRouter是官方的路由插件&#xff0c;适合单页面应用/网页的切换。VueRouter目前有3.x版本和4.x版本&#xff0c;3.x版本只能结合vue2使用&#xff0c;4.x版本只能结合vue3使用。安装&#xff1a;npm install vue-router3 目的 初始版本&#xff1a;我们想…...

文心一言 VS 讯飞星火 VS chatgpt (103)-- 算法导论10.1 1题

一、用go语言&#xff0c;仿照图 10-1&#xff0c;画图表示依次执行操作 PUSH(S&#xff0c;4)、PUSH(S&#xff0c;1)、PUSH(S&#xff0c;3)、POP(S)、PUSH(S&#xff0c;8)和 POP(S)每一步的结果&#xff0c;栈 S初始为空&#xff0c;存储于数组 S[1…6]中。 文心一言&…...

【ShaderLab罪恶装备卡通角色_二次元风格_“Sol Badguy“_角色渲染(第二篇)】

罪恶装备背德之炎卡通角色_二次元风格_Unity 角色渲染 角色初始效果&#xff1a;基础渲染SimpleBas 资源分析模型顶点颜色&#xff1a; 贴图资源SOL_base_基础色块效果&#xff1a;其中SOL_base_A通道的效果&#xff1a; SOL_ilm&#xff1a;如下SOL_ilm模型上区域分布- 左到右…...

raw智能照片处理工具DxO PureRAW mac介绍

DxO PureRAW Mac版是一款raw智能照片处理工具&#xff0c;该软件采用了智能技术&#xff0c;以解决影响所有RAW文件的七个问题&#xff1a;去马赛克&#xff0c;降噪&#xff0c;波纹&#xff0c;变形&#xff0c;色差&#xff0c;不想要的渐晕&#xff0c;以及缺乏清晰度。 Dx…...

1.centos7 安装显卡驱动、cuda、cudnn

安装conda 参考 python包 2.安装conda python库-CSDN博客3.Cenots Swin-Transformer-Object-Detection环境配置-CSDN博客 1.安装显卡驱动 步骤1&#xff1a;安装依赖 yum -y install kernel-devel yum -y install epel-release yum -y install gcc 步骤2&#xff1a;查询显…...

WordPress主题开发( 十四)之—— 主题开发示例

要深入了解WordPress主题开发的最佳实践和标准&#xff0c;参考主题示例是一种非常有效的方法。在这里&#xff0c;我们将介绍两个主题示例&#xff1a;默认的Twenty主题和Underscores主题&#xff0c;它们都是出色的学习资源。 默认“Twenty”主题 自WordPress 3.0版本开始&a…...

rust学习-any中的downcast和downcast_ref

背景 看rust官方文档,好奇Any和Go的Any是否是一回事,看到下文的一行代码,了解下它的功能 pub trait Any: static {// Required methodfn type_id(&self) -> TypeId; }std::any 用于 dynamic typing 或者 type reflection 模拟动态类型的trait。 大多数类型都实现 …...

js检测数据类型总结

目录 一、typeof 二、instanceof 三、constructor 四、Object.prototype.toString.call() Object.prototype.toString.call(obj)类型检测原理 五、__proto__ 六、 其他 一、typeof typeof在对值类型number、string、boolean 、symbol、 undefined、 function的反应是精准…...

获奖作品展示 | 2023嵌入式大赛AidLux系列作品精彩纷呈

第六届&#xff08;2023&#xff09;全国大学生嵌入式芯片与系统设计竞赛应用赛道全国总决赛已于8月下旬圆满结束。 本届赛事中&#xff0c;AidLux是广和通5G智能物联网赛题的唯一软件支持&#xff0c;阿加犀为该赛题学生们提供了全程线上辅导、技术答疑&#xff0c;以及大赛专…...

Mybatis 二级缓存(使用Redis作为二级缓存)

上一篇我们介绍了mybatis中二级缓存的使用&#xff0c;本篇我们在此基础上介绍Mybatis中如何使用Redis作为二级缓存。 如果您对mybatis中二级缓存的使用不太了解&#xff0c;建议您先进行了解后再阅读本篇&#xff0c;可以参考&#xff1a; Mybatis 二级缓存https://blog.csd…...

VMware vSphere ESXI 6.7 U3封装RTL8125B网卡驱动

之前的教程VMware vSphere ESXI 6.7 U3最新版本封装网卡驱动补丁可参考&#xff0c;本文为此文章的又一次实践 准备工作 1、ESXi-Customizer-PS-v2.6.0.ps1 &#xff08;官网下载&#xff0c;Github下载&#xff09; 2、ESXi670-202210001.zip &#xff08;VMware vSphere Hy…...

黑马JVM总结(二十五)

&#xff08;1&#xff09;字节码指令-cinit 构造方法可以分为两类&#xff0c;一类是cinit 一类init cinit是整个类的构造方法 putstatic&#xff1a;进行static变量的赋值&#xff0c;是到常量池里找到名字一个叫做i的变量 &#xff08;2&#xff09;字节码指令-init in…...

基础数据结构之——【顺序表】(上)

从今天开始更新数据结构的相关内容。&#xff08;我更新博文的顺序一般是按照我当前的学习进度来安排&#xff0c;学到什么就更新什么&#xff08;简单来说就是我的学习笔记&#xff09;&#xff0c;所以不会对一个专栏一下子更新到底&#xff0c;哈哈哈哈哈哈哈&#xff01;&a…...

Apollo自动驾驶系统概述(文末参与活动赠送百度周边)

前言 「作者主页」&#xff1a;雪碧有白泡泡 「个人网站」&#xff1a;雪碧的个人网站 「推荐专栏」&#xff1a; ★java一站式服务 ★ ★ React从入门到精通★ ★前端炫酷代码分享 ★ ★ 从0到英雄&#xff0c;vue成神之路★ ★ uniapp-从构建到提升★ ★ 从0到英雄&#xff…...

Java 21 新特性:Unnamed Classes and Instance Main Methods

Java 21引入了两个语言核心功能&#xff1a; 未命名的Java类你说新的启动协议&#xff1a;该协议允许更简单地运行Java类&#xff0c;并且无需太多样板 下面一起来看个例子。通常&#xff0c;我们初学Java的时候&#xff0c;都会写类似下面这样的 Hello World 程序&#xff1…...

Tomcat启动后的日志输出为乱码

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…...

CSP-J第二轮试题-2021年-4题

文章目录 参考&#xff1a;总结 [CSP-J 2021] 小熊的果篮题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 样例 #2样例输入 #2样例输出 #2 样例 #3样例输入 #3样例输出 #3 提示答案答案1答案2答案3 现场真题注意事项 参考&#xff1a; https://www.luogu.com.cn/probl…...

10.1 今日任务:select实现服务器并发

#include <myhead.h>#define ERR_MSG(msg) do{\fprintf(stderr, "__%d__:", __LINE__); \perror(msg);\ }while(0)#define PORT 8888 //端口号&#xff0c;范围1024~49151 #define IP "192.168.112.115" //本机IP&#xff0c;ifco…...

P1540 [NOIP2010 提高组] 机器翻译(模拟)

[NOIP2010 提高组] 机器翻译 题目背景 小晨的电脑上安装了一个机器翻译软件&#xff0c;他经常用这个软件来翻译英语文章。 题目描述 这个翻译软件的原理很简单&#xff0c;它只是从头到尾&#xff0c;依次将每个英文单词用对应的中文含义来替换。对于每个英文单词&#xf…...

系统设计 --- MongoDB亿级数据查询优化策略

系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log&#xff0c;共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题&#xff0c;不能使用ELK只能使用…...

微服务商城-商品微服务

数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...

从零实现STL哈希容器:unordered_map/unordered_set封装详解

本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说&#xff0c;直接开始吧&#xff01; 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...

AI,如何重构理解、匹配与决策?

AI 时代&#xff0c;我们如何理解消费&#xff1f; 作者&#xff5c;王彬 封面&#xff5c;Unplash 人们通过信息理解世界。 曾几何时&#xff0c;PC 与移动互联网重塑了人们的购物路径&#xff1a;信息变得唾手可得&#xff0c;商品决策变得高度依赖内容。 但 AI 时代的来…...

2025年渗透测试面试题总结-腾讯[实习]科恩实验室-安全工程师(题目+回答)

安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 腾讯[实习]科恩实验室-安全工程师 一、网络与协议 1. TCP三次握手 2. SYN扫描原理 3. HTTPS证书机制 二…...

在树莓派上添加音频输入设备的几种方法

在树莓派上添加音频输入设备可以通过以下步骤完成&#xff0c;具体方法取决于设备类型&#xff08;如USB麦克风、3.5mm接口麦克风或HDMI音频输入&#xff09;。以下是详细指南&#xff1a; 1. 连接音频输入设备 USB麦克风/声卡&#xff1a;直接插入树莓派的USB接口。3.5mm麦克…...

嵌入式学习之系统编程(九)OSI模型、TCP/IP模型、UDP协议网络相关编程(6.3)

目录 一、网络编程--OSI模型 二、网络编程--TCP/IP模型 三、网络接口 四、UDP网络相关编程及主要函数 ​编辑​编辑 UDP的特征 socke函数 bind函数 recvfrom函数&#xff08;接收函数&#xff09; sendto函数&#xff08;发送函数&#xff09; 五、网络编程之 UDP 用…...

Axure 下拉框联动

实现选省、选完省之后选对应省份下的市区...

Vue3 PC端 UI组件库我更推荐Naive UI

一、Vue3生态现状与UI库选择的重要性 随着Vue3的稳定发布和Composition API的广泛采用&#xff0c;前端开发者面临着UI组件库的重新选择。一个好的UI库不仅能提升开发效率&#xff0c;还能确保项目的长期可维护性。本文将对比三大主流Vue3 UI库&#xff08;Naive UI、Element …...

自定义线程池1.2

自定义线程池 1.2 1. 简介 上次我们实现了 1.1 版本&#xff0c;将线程池中的线程数量交给使用者决定&#xff0c;并且将线程的创建延迟到任务提交的时候&#xff0c;在本文中我们将对这个版本进行如下的优化&#xff1a; 在新建线程时交给线程一个任务。让线程在某种情况下…...