Linux- 调用signal 设定特定信号sig的处理函数handler

调用 signal 可以设定特定信号 sig 的处理函数 handler。进程收到另⼀个调用 kill 发送过来的信号 sig 时,便会开始执行 handler 函数。通过这⼀对函数便可以实现最基本的进程间通信,以下面的程序为例:

#include <unistd.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <stdio.h>void sig_routine(int dunno) {switch (dunno){case 6:printf("\tI am child process, I receive signal SIGABRT\n");break;}
}int main() {pid_t pid;int status;int sig;signal(SIGABRT, sig_routine);if (!(pid = fork())) {printf("\tHi I am child process !\n");sleep(10);return 0;}else {sleep(1);kill(pid, SIGABRT); // // Sends a SIGABRT (abort program) signalwait(&status);if (WIFSIGNALED(status)) {printf("child process receive signal %d\n", WTERMSIG(status));}else {printf("child process exits normally with %d\n", WTERMSIG(status));}}return 0;
}

运行结果如下:

majn@tiger:~/C_Project/signal_project$ ./signal_demo Hi I am child process !I am child process, I receive signal SIGABRT
child process exits normally with 0

这个程序展示了如何在父子进程之间使用信号。它创建一个子进程,父进程向子进程发送一个 SIGABRT 信号,子进程捕获并处理这个信号,然后继续执行并最终正常结束。

程序的关键部分如下:

  1. 信号处理函数 sig_routine(int dunno):

    • 当子进程接收到 SIGABRT 信号(其值为6)时,它调用此函数来处理该信号。
    • 此函数仅打印消息,表示子进程已接收到该信号,并继续执行。
  2. 主程序:

    • 通过 signal(SIGABRT, sig_routine);,程序为 SIGABRT 信号设置了一个处理函数,即 sig_routine
    • 使用 fork() 创建子进程。
    • 子进程打印一条消息表示它是子进程,然后休眠10秒,并正常退出。
    • 父进程休眠1秒,确保子进程已经开始执行并注册了信号处理函数。然后,它向子进程发送一个 SIGABRT 信号。
    • 父进程使用 wait(&status) 等待子进程结束,并获取子进程的结束状态。
    • 根据子进程的结束状态,父进程打印相应的消息。

输出结果如下:

  • 子进程首先输出 “Hi I am child process!”。
  • 当子进程接收到 SIGABRT 信号时,它输出 “I am child process, I receive signal SIGABRT”。
  • 最终,父进程输出 “child process exits normally with 0”,因为子进程正常结束,没有因为接收到信号而被终止。

所以,这个程序的关键是理解信号的默认行为(例如,SIGABRT 默认会终止进程)可以被覆盖,如果为该信号注册了一个处理函数。在这个例子中,处理函数只是简单地打印了一条消息,而不是终止进程。


如果不为该信号注册一个处理函数,则运行结果如下:

#include <unistd.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <stdio.h>int main() {pid_t pid;int status;int sig;// signal(SIGABRT, sig_routine);if (!(pid = fork())) {printf("\tHi I am child process !\n");sleep(10);return 0;}else {sleep(1);kill(pid, SIGABRT); // // Sends a SIGABRT (abort program) signalwait(&status);if (WIFSIGNALED(status)) {printf("child process receive signal %d\n", WTERMSIG(status));}else {printf("child process exits normally with %d\n", WTERMSIG(status));}}return 0;
}

运行结果为:

majn@tiger:~/C_Project/signal_project$ ./signal_demo Hi I am child process !
child process receive signal 6

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

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

相关文章

ToBeWritten之攻击者模拟

也许每个人出生的时候都以为这世界都是为他一个人而存在的&#xff0c;当他发现自己错的时候&#xff0c;他便开始长大 少走了弯路&#xff0c;也就错过了风景&#xff0c;无论如何&#xff0c;感谢经历 转移发布平台通知&#xff1a;将不再在CSDN博客发布新文章&#xff0c;敬…

Word | 简单可操作的快捷公式编号、右对齐和引用方法

1. 问题描述 在理工科论文的写作中&#xff0c;涉及到大量的公式输入&#xff0c;我们希望能够按照章节为公式进行编号&#xff0c;并且实现公式居中&#xff0c;编号右对齐的效果。网上有各种各样的方法来实现&#xff0c;操作繁琐和简单的混在一起&#xff0c;让没有接触过公…

路由综合实验

RIP配置 在R1上配置 rip 1 #此处的1表示进程号&#xff0c;非版本号 version 2 #选择rip版本2 network 100.0.0.0 network 12.0.0.0 network 13.0.0.0 #rip宣告时只能宣告主类网络&#xff0c;实际上是对内宣告为主类网络&#xff0c;对外转发时时携带子网掩码的在R2上…

【postgresql】 ERROR: multiple assignments to same column “XXX“

Cause: org.postgresql.util.PSQLException: ERROR: multiple assignments to same column "XXX"; bad SQL grammar []; nested exception is org.postgresql.util.PSQLException: ERROR: multiple assignments to same column "XXX"; 原因&#xff1a;or…

Java开发需要的网络基础知识,搞清楚计算机网络底层原理

作者&#xff1a;逍遥Sean 简介&#xff1a;一个主修Java的Web网站\游戏服务器后端开发者 主页&#xff1a;https://blog.csdn.net/Ureliable 觉得博主文章不错的话&#xff0c;可以三连支持一下~ 如有需要我的支持&#xff0c;请私信或评论留言&#xff01; 前言 计算机基础是…

变电站运维服务方案

一、背景与目标 随着电力行业的快速发展&#xff0c;变电站的数量和规模不断扩大&#xff0c;运维服务的需求也日益增长。为了确保变电站的安全、稳定、高效运行&#xff0c;提高运维服务质量&#xff0c;本文档旨在提供一套全面的变电站运维服务方案。 二、服务范围 …

lv5 嵌入式开发-6 线程的取消和互斥

目录 1 线程通信 – 互斥 2 互斥锁初始化 – pthread_mutex_init 3 互斥锁销毁 pthread_mutex_destroy 4 申请锁 – pthread_mutex_lock 5 释放锁 – pthread_mutex_unlock 6 读写锁 7 死锁的避免 8 条件变量&#xff08;信号量&#xff09; 9 线程池概念和实现 9.1 …

CCS介绍

CCS介绍 设置主体颜色 修改字体的颜色和大小 安装一些插件 CCS中的App中心 切换工作空间 导入工程

el-table-column默认选中一个复选框和只能单选事件

表格代码 <el-table ref"contractTable" v-loading"loading" :data"contractList" selection-change"contractSelectionChange" style"margin-top: 10%;"><el-table-column type"selection" width"…

【分享】Word文档如何批量转换成PDF?

Word格式比较容易编辑&#xff0c;是工作中经常用到的文档工具&#xff0c;有时候为了避免文档在传送中出现乱码&#xff0c;或者防止被随意更改&#xff0c;很多人会把Word文档转换成PDF&#xff0c;那Word文档要怎样转成PDF呢&#xff1f;如果Word文档很多&#xff0c;有没有…

uniapp获取一周日期和星期

UniApp可以使用JavaScript中的Date对象来获取当前日期和星期几。以下是一个示例代码&#xff0c;可以获取当前日期和星期几&#xff0c;并输出在一周内的每天早上和晚上&#xff1a; // 获取当前日期和星期 let date new Date(); let weekdays ["Sunday", "M…

云安全【阿里云ECS攻防】

关于VPC的概念还请看&#xff1a;记录一下弹性计算云服务的一些词汇概念 - 火线 Zone-安全攻防社区 一、初始化访问 1、元数据 1.1、SSRF导致读取元数据 如果管理员给ECS配置了RAM角色&#xff0c;那么就可以获得临时凭证 如果配置RAM角色 在获取ram临时凭证的时候&#xff…

Three.js后期处理简明教程

后期处理&#xff08;Post Processing&#xff09;通常是指对 2D 图像应用某种效果或滤镜。 在 THREE.js 中我们有一个包含一堆网格物体的场景。 我们将该场景渲染为 2D 图像。 通常&#xff0c;该图像会直接渲染到画布中并显示在浏览器中&#xff0c;但我们可以将其渲染到渲染…

人机逻辑中的家族相似性与非家族相似性

维特根斯坦的家族相似性理论是他在《哲学研究》中提出的一个重要概念。他认为&#xff0c;语言游戏是一种人们使用语言的方式&#xff0c;不同的语言游戏之间可能存在相似性&#xff0c;就像一个家族的成员之间存在相似性一样。维特根斯坦认为&#xff0c;相似性不是通过一个共…

Quartz 体系结构

Quartz的体系结构 Quartz的重要组件 Scheduler 用于与调度程序交互的主程序接口。 Scheduler调度程序-任务执行计划表&#xff0c;只有安排进执行计划的任务Job&#xff08;通过scheduler.scheduleJob方法安排进执行计划&#xff09;&#xff0c;当它预先定义的执行时间到了的时…

mac 解决 vscode 权限不足问题,Insufficient permissions

commod 空格&#xff0c;输入终端并打开写入指令 sudo chown -R xxxxxx1 xxxxx2&#xff08;例如我的sudo chown -R admin Desktop&#xff0c;具体参数查看下方&#xff09; x1: 用户名&#xff0c;可通过左上角查看 x2: 目标文件夹。可以另起一个终端&#xff0c;用cd 和 l…

Unity当中的灯光类型

文章目录 前言一、Directional平行光二、Point点灯三、Spot 聚光灯四、Area面光灯&#xff0c;只用于烘培 前言 Unity当中的灯光类型 一、Directional平行光 Unity当中最重要的灯管类型&#xff0c;类似现实中的太阳光 二、Point点灯 类似现实中的灯泡&#xff0c;萤火虫&a…

内存对齐--面试常问问题和笔试常考问题

1.内存对齐的意义 C 内存对齐的主要意义可以简练概括为以下几点&#xff1a; 提高访问效率&#xff1a;内存对齐可以使数据在内存中以更加紧凑的方式存储&#xff0c;从而提高了数据的访问效率。处理器通常能够更快地访问内存中对齐的数据&#xff0c;而不需要额外的字节偏移计…

oracle

title: “Oracle” createTime: 2021-12-13T16:35:4108:00 updateTime: 2021-12-13T16:35:4108:00 draft: false author: “name” tags: [“oracle”] categories: [“db”] description: “测试的” 时间字段分析 timestamp 精确到秒后面6位 createTime: 2021-12-13T16:35:…

vue3基础

141.用vite创建vue3项目 142.项目目录 vue3中&#xff0c;直接导入组件就能用 不再要求唯一根元素 //createApp(App)是创建实例&#xff0c;.mount(#app)是在将实例往id为app的盒子上挂载 createApp(App).mount(#app)//挂载就是让实例接管一片区域 assets是存放图片或样式的…