Linux编程基础 4.4:信号捕获

5 信号捕获

信号的产生是异步事件,进程不知道信号何时会递送,也不会等待信号到来。
进程可以为信号注册信号处理函数来实现自定义动作。
进程的信号在内核态处理,内核为每个进程准备了一个信号向量表,记录每个信号所对应的处理机制。如果用户自定义了处理方式,则内核会使信号向量表中的指针指向新的信号处理函数。
Linux提供了两个捕获信号的函数:

  • signal
  • sigaction

5.1 signal函数

#include <signal.h>typedef void(* sighandler_t)(int); //sighandler_t就是一个函数指针,指向的函数接受一个整型参数并返回一个无类型指针。加上typedef之后sighandler_t就是一种新的类型,就可以像int一样地去用它,不同的是它声明是一种函数指针
sighandler_t signal(int signum, sighandler_t handler);

函数功能:能实现信号屏蔽,但其主要功能仍为捕获信号,修改信号向量表中该信号的处理函数指针。

参数说明

  • signum:信号编号;
  • handler:自定义信号处理函数的函数指针。

返回值说明

  • 成功:返回先前信号处理函数指针
  • 不成功:返回SIG_ERR。

【案例1】为2号信号SIGINT设置自定义信号处理函数,并在信号处理函数中将信号恢复为默认处理函数。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <signal.h>void sig_int(int paraSigno){			//自定义信号处理函数printf("......catch you, SIGINT\n");signal(SIGINT, SIG_DEL);			//信号处理函数执行
}//of sig_intint main(){signal(SIGINT, sig_int);			//捕获信号SIGINT,修改信号处理函数while(1);							//等待信号递达return 0;
}//of main

执行后使用组合键Ctrl+C或kill命令发送信号到当前进程,signal(SIGINT, SIG_DEL)恢复为默认处理函数后,程序将终止运行。

5.2 sigaction函数

#include <signal.h>int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);struct sigaction{void (*sa_handler)(int);void (*sa_sigaction)(int, siginfo_t *, void *);sigset_t sa_mask;	//一个用于指定函数执行期间捕获屏蔽信号的位图int sa_flags;		//设置是否使用默认值,默认情况下,函数会屏蔽自己发送的信号,避免重新进入函数void (*sa_restorer)(void);
};

函数功能:与signal相比,最大的优点是支持信息传递。

参数说明

  • signum:信号编号;
  • act:传入参数,包含自定义信息处理函数和一些携带的参数;
  • oldact:传出参数,包含旧的信息处理函数等信息。

返回值说明

  • 成功:0;
  • 不成功:-1。

【案例2】使用sigaction函数修改2号信号SIGINT的默认动作。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <signal.h>void sig_int(int paraSigno){printf("......catch you, SIGINT, signo = %d\n", paraSigno);sleep(5);       //模拟信号处理函数执行时间
}//of sig_intint main(){struct sigaction act, oldact;act.sa_handler = sig_int;       //修改信号处理函数指针sigemptyset(&act.sa_mask);      //初始化位图,表示不屏蔽任何信号sigaddset(&act.sa_mask, SIGINT);//更改信号SIGINT的信号处理函数act.sa_flags = 0;               //设置flags屏蔽自身所发信号sigaction(SIGINT, &act, &oldact);while(1);return 0;
}//of main

执行后使用组合键Ctrl+C或kill命令发送信号到当前进程,观察运行结果。

6 课后编程题

利用所学的信号处理函数实现sleep函数的功能。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

苹果7手机严重卡顿_分享苹果手机最实用的7个技巧,各个精心挑选,不知道真的太亏了...

使用苹果手机这么久了&#xff0c;你一定也发现了不少好用的功能&#xff0c;今天就来分享苹果手机最实用的7个技巧&#xff0c;每个都是精心挑选&#xff0c;不要错过&#xff0c;总有一个是你需要的。1、 三指操作在编辑文档的时候&#xff0c;三指左滑是撤销(上一步编辑撤销…

实验一:系统编程开发环境实验

一【实验目的】 1.熟悉Linux开发环境&#xff1b; 2.掌握Linux程序编译调试方法&#xff1b; 3.理解文件I/O通用操作&#xff0c;掌握内核函数的基本用法&#xff1b; 4.支撑网络空间安全专业的专业核心能力、综合创新能力。 二【实验要求】 以下每个实验均要求&#xff1a;…

如何获取大端中的数据_【软件】ProE中各种获取数据方式的区别

更多精彩&#xff0c;请点击上方蓝字关注我们&#xff01;软件ProE中各种获取数据方式的区别输入特征&#xff1a;输入特征是通过数据共享功能从外部文件输入几何的&#xff0c;文件输入以后&#xff0c;会转换成proe软件能够识别的几何&#xff0c;称为一个特征发布几何&#…

实验二:文件操作编程实验

一【实验目的】 1.掌握文件或目录属性信息的函数stat()函数的使用&#xff1b; 2.掌握目录操作的函数opendir 函数和readdir函数的使用&#xff1b; 3.编写程序mysearch.c递归实现打印输出任意目录下&#xff0c;指定类型的所有文件&#xff0c;如&#xff1a;./mysearch /hom…

数字类 default 0和 default 0_全方位的数字规划工具Visual Components 4.0 数字化工厂仿真软件...

Visual Components 是全方位的数字规划工具。无论从制程规划、生产到营销都能够整合在同一个平台上作业&#xff0c;有助于内部的技术沟通及外部营销。此外&#xff0c;Visual Components 整合了物流及机器人模拟功能&#xff0c;帮助企业在研发前期即可进行产能确认&#xff0…

python中写入csv文件的方法_Python写入CSV文件的方法

python笔记5-python2写csv文件中文乱码问题前言python2最大的坑在于中文编码问题&#xff0c;遇到中文报错首先加u&#xff0c;再各种encode、decode。当list、tuple、dict里面有中文时&#xff0c;打印出来的是Unicode编码&#xff0c;这个是无解的。对中文编码纠结的建议尽快…

实验三:进程管理编程实验

一【实验目的】 1.熟悉进程环境、进程生命周期&#xff1b; 2.支撑网络空间安全专业的专业核心能力、综合创新能力。 二【实验要求】 以下每个实验均要求&#xff1a; 1.“实验源代码”处&#xff1a;粘贴所编写的程序源码&#xff0c;务必添加关键语句的注释&#xff1b; 2…

会说话的狗狗本电脑版_会说话的电脑有点酷!惠普星14帮你解锁“偷懒”新姿势_惠普 星 14 2020(i5 1135G7/16GB/512GB/MX450)_笔记本新闻...

在现实生活中你是否遇到过这样的情况&#xff0c;笔记本近在咫尺&#xff0c;但你却懒得走到笔记本面前进行操作。当你疲惫地躺在床上时&#xff0c;心里也总是暗想&#xff0c;如果笔记本能够听我的指令跟我对话就好了。工作和生活当中&#xff0c;我们总免不了想要“偷懒”&a…

expect巡检服务器_Shell-批量巡检服务器脚本

文件说明该Shell脚本旨在针对大量Linux服务器的巡检提供一种相对自动化的解决方案。脚本组成有三部分&#xff1a;shellsh.sh、checksh.sh、file.txt&#xff1b;这三个文件需放在一个文件夹下以root权限执行&#xff0c;缺一不可。脚本用法将要巡检的服务器的IP地址和对应的密…

实验四:进程间通信编程实验

一【实验目的】 1.理解进程间通信原理&#xff1b; 2.掌握进程中信号量、共享内存、消息队列相关的函数的使用&#xff1b; 3.支撑网络空间安全专业的专业核心能力、综合创新能力。 二【实验要求】 以下每个实验均要求&#xff1a; 1.“实验源代码”处&#xff1a;粘贴所编写…

细粒度图像分类_1.1、 图片分类

记录图像分类论文资源列表。图片分类任务可以分为&#xff1a;粗粒度图片分类、细粒度图片分类。2012 AlexNet &#xff1a;ImageNet Classification with Deep Convolutional Neural Networks。2014 GoogLeNet&#xff1a;Going Deeper with Convolutions。Rethinking the Inc…

diy服务器个人主机_Re:从零开始的服务器-微型服务器DIY手记

国际象棋测试4-Chess Benchmark.png (25.64 KB, 下载次数: 63)2017-3-22 19:43 上传RAR benchmarkWinRAR自带的基准测试7-RARbench.png (15.8 KB, 下载次数: 54)2017-3-22 19:45 上传7-zip benchmark7zip自带的基准测试8-7zipbench.png (31.2 KB, 下载次数: 70)2017-3-22 19:45…

实验五:线程编程实验

一【实验目的】 1.理解线程环境、线程的生命周期&#xff0c; 2.理解线程同步&#xff0c;掌握内核函数的基本用法。 3.支撑网络空间安全专业的专业核心能力、综合创新能力。 二【实验要求】 以下每个实验均要求&#xff1a; 1.“实验源代码”处&#xff1a;粘贴所编写的程序…

where里能用max吗_超市里四五元钱的速冻饺子能买吗?

展开全部我家里都特别喜欢吃带馅的食物&#xff0c;尤其是我儿子只要是饺子和馄饨&#xff0c;吃起来准没够。62616964757a686964616fe59b9ee7ad9431333433653938包饺子虽然不是什么力气活&#xff0c;但是有时候做起来也感觉太过繁琐&#xff0c;尤其是孩子要吃的时候&#xf…

python的迭代_迭代法 python

详解迭代器的使用 | 手把手教你入门Python之八十上一篇&#xff1a;自定义异常 | 手把手教你入门Python之七十九下一篇&#xff1a;生成器 | 手把手教你入门Python之八十一本文来自于千锋教育在阿里云开发者社区学习中心上线课程《Python入门2020最新大课》&#xff0c;主讲人姜…

实验六:套接字编程实验

一【实验目的】 1.掌握面向连接的套接字编程框架&#xff1b; 2.掌握面向无连接的套接字编程框架; 3.掌握I/O复用、套接字选项设置&#xff1b; 4.掌握非阻塞式I/O。 二【实验要求】 以下每个实验均要求&#xff1a; 1.“实验源代码”处&#xff1a;粘贴所编写的程序源码&am…

idea代码回滚_IDEA远程仓库版本回滚

使用 git 进行项目的版本控制时&#xff0c;肯定会遇到回滚版本的情况&#xff0c;回滚有两种&#xff0c;一种是本地仓库回滚&#xff0c;另外一种是远程仓库回滚。以下详细讲解两种回滚方式&#xff0c;本文主要讲解远程回滚&#xff0c;以及常见使用误区。本地仓库回滚本地回…

AppScan api登录接口 postman_【Postman】12 Postman monitor功能使用

通过前面的文章&#xff0c;我们已经能完成接口的Collection&#xff0c;添加断言&#xff0c;Data文件数据驱动&#xff0c;设置变量&#xff08;Data、Globals和Environment&#xff09;等等方法&#xff0c;对我们的接口进行个各种的测试&#xff0c;保证其正确性。但是还可…

Linux编程基础 5.1:管道

1 简介 Linux进程通信机制&#xff1a; 管道信号量消息队列共享内存socket通信 2 管道 管道其实质是由内核管理的一个缓冲区 形象地认为管道的两端连接着两个进程&#xff1a; 一个进程进行信息输出&#xff0c;将数据写入管道&#xff1b;另一个进程进行信息输入&#xff…

python pd Series 添加行_Python数据分析与挖掘的常用工具

Python语言&#xff1a;简要概括一下Python语言在数据分析、挖掘场景中常用特性&#xff1a;列表(可以被修改)&#xff0c;元组(不可以被修改)字典(结构)集合(同数学概念上的集合)函数式编程(主要由lambda()、map()、reduce()、filter()构成)Python数据分析常用库&#xff1a;P…