在Linux中信号也称为软中断,进程在收到信号之后在对信号进行处理,可以说就是一个中断的过程。本文就来为大家简单地解析一下Linux信号机制。

1、安装信号处理函数

在系统编程的层面上与信号的处理关系最直接相关的函数有两个,他们用来安装信号处理函数:

sighandler_t signal(int signum, sighandler_t handler);

int sigaction(int signum, const struct sigaction *act,,struct sigaction *oldact);

第一个函数signal比较简单,sighandler_t 是一个别名,其原型是 typedef void (*sighandler_t)(int),他是一个函数指针,接受一个类型为int的参数(信号的编号),返回void。例如要对SIGUSR1信号进行处理:

void handler(int sig)

{

//strsiganl 功能是把信号的编号转为信号说明的字符串

printf(“Rcv a signal:%s”,strsignal(sig));

}

int main()

{

signal(SIGUSR1,handler);

while(1)

;

}

(这段程序其实是有问题的,后面会说到)这段程序本来是一段死循环,但是对他发送SIGUSR1信号,程序会从while中“中断”转去执行handler中的代码。在shell中使用kill命令发送信号SIGUSR1 于是程序就答应出了一段这样的信息:Rcv a signal:User defined signal 1。signal()的用法几乎就是这么简单。但是由于可移植的原因,参与项目开发时,应该使用下面的这个函数。

sigaction()函数的参数中有两个结构体,其man手册原型如下:

struct sigaction {

void (*sa_handler)(int);

void (*sa_sigaction)(int, siginfo_t *, void *);

sigset_t sa_mask;

int sa_flags;

void (*sa_restorer)(void);

};

据我所知sa_handler和sa_sigaction其实是在一个union中,他们都是指向信号处理函数的指针。

sa_mask 是要屏蔽的信号,sa_flags 有多种选项。(关于这两点后文再细说)。从sigaction()原型中可以发现参数中有两个struct sigaction参数,其中act是要安装的信号处理,而oldact是用来带回原来的处理方式方便我们处理完信号后的恢复。如果不需要拿回之前的信号处理方式可以把第三个参数置为NULL,反之如果只想得到之前的处理方式而不像安装新的信号处理,可以把第二个参数置为NULL,这点用signal()是办不到的。用sigaction()改写上面的例子是这样的:

1 void handler(int sig)

2 {

3 printf(“Rcv a signal:%s”,strsignal(sig));

4 }

5

6 int main()

7 {

8 struct sigaction act;

9 sigemptyset(&act.sa_mask);

10 act.sa_handler = handler;

11 act.sa_flags = 0;

12 sigaction(SIGUSR1,&act,NULL);

13 while(1)

14 ;

15 }

linux软件安装完成信号,Linux信号机制解析相关推荐

  1. linux软件安装非系统盘,linux操作系统可不可以像安装windows软件一样在windows系统下的硬盘上安装...

    linux操作系统可不可以像安装windows软件一样在windows系统下的硬盘上安装 答案:2  信息版本:手机版 解决时间 2020-07-24 14:13 已解决 2020-07-23 16: ...

  2. android安装linux软件安装,Android for Linux 开发工具安装说明

    在此详细记录 Android 开发工具的安装过程,以备后查. 在 Windows 7 下使用虚拟机进行,也可以直接用 Ubuntu 安装光碟做一个真实环境 虚拟机:VirtualBox 3.2.12( ...

  3. Linux软件安装解决方案

     Linux软件安装解决方案 在linux中安装软件是一件并不算轻松的工作,有很多中解决方案供你选择,但需要的是你的一点点耐心与智慧!下面我将就Linux中最常见的安装方式,由浅入深的逐一做简单介绍与 ...

  4. linux软件安装方法

    在Linux系统中,软件安装程序比较纷繁复杂,不过最常见的有两种: 1)一种是软件的源代码,您需要自己动手编译它.这种软件安装包通常是用gzip压缩过的tar包(后缀为.tar.gz). 2)另一种是 ...

  5. Linux软件安装——软件包

    Linux软件安装--软件包 摘要:本文主要学习了Linux下软件安装的相关知识. 软件包 简介 Linux下的软件包众多,且几乎都是经GPL授权.免费开源(无偿公开源代码)的.这意味着如果你具备修改 ...

  6. 6、Linux软件安装管理之——dpkg与apt-*详解

    一.序言 上一篇文章<Linux软件安装管理之--源码安装详解>详细介绍了Linux平台下的源码包安装原理,虽然使用源代码进行软件编译可以具有定制化的设置,但对于Linux distrib ...

  7. Linux源代码软件安装,Linux软件安装:源代码与软件安装

    欢迎进入Linux社区论坛,与200万技术人员互动交流 >>进入 Linux软件安装:源代码与软件安装 1 开源软件的一些基本概念 1.1 什么是开放源码,编译程序与可执行文件 可执行文件 ...

  8. Linux软件安装——安装软件的命令

    Linux软件安装--安装软件的命令 摘要:本文主要学习了如何在Linux系统中安装.更新.卸载软件. rpm命令 rpm命令用来在Linux系统上进行软件的安装. 基本语法 安装命令: 1 rpm ...

  9. linux软件安装管理

    Linux软件安装管理 TonyLinux系统工程师 难度初级  时长 3小时 6分  学习人数64016  综合评分9.8 收藏 上面是linux 的源代码安装包 linux有两种类型的软件安装方式 ...

  10. Linux软件安装方法小结

    Linux软件安装方法小结(附:rpm详解) 在使用Linux系统的过程中,软件包的安装是避免不了的,在Linux下,软件安装程序的种类很多,安装方法也各式各样,(舒适性自然比不上windows :- ...

最新文章

  1. 《你的灯亮着吗》读书笔记1
  2. Nature子刊 | 研究人员提出神经脆性可作为癫痫发作区(SOZ)的脑电图(EEG)标志物
  3. Understand Skills-Based Routing
  4. 判断DataRow中某列是否为空的方法
  5. java map去重复的数据_使用HashMap去重复数据.
  6. 使用bypy从ubuntu通过命令行上传文件到百度云
  7. Zcash已发布ZIP 313提案
  8. 升级glibc库到glibc-2.14.1
  9. sts4linux,STS3下载和安装,STS4升级
  10. 百度万年历API 获取节假日和工作日调休
  11. 软考高级信息系统项目管理师/高项和PMP的区别,以及对比
  12. qc快充协议2.0/3.0
  13. TDS:标签平台+API平台+数据共享平台,助力数据运营平台建设
  14. pdfbox / XSL + FOP 转换 PDF文档
  15. 大众点评评论抓取-加密评论信息完整抓取
  16. 基于LBS的六边形热力图算法
  17. 正确理解以下名词及其含义:(1)源程序,目标程序,可执行程序(2)程序编辑,程序编译,程序连接(3)程序,程序模块,程序文件 (4)函数,主函数,被调用函数,库函数
  18. idea中vue文件 游览器图标_vue项目中icon图标的完美引入
  19. 学计算机游戏本,2019游戏笔记本推荐_新学期游戏本准备好了吗-太平洋电脑网
  20. webview卡顿_分享三个小技巧,微信卡顿的人千万不要错过哦

热门文章

  1. 8.软件架构设计:大型网站技术架构与业务架构融合之道 --- 高并发问题
  2. 1.卷1(套接字联网API)---简介
  3. 110. PHP 读取 ini ,ftp 上传
  4. 7. JavaScript RegExp 对象
  5. css3中的background的新特性background-origin,background-clip,background-size详解
  6. css3中的box-shadow的用法与text-shadow的用法
  7. dubbo入门之微服务客户端服务端配置
  8. Amazon AWS S3 上传文件 并获取公用url
  9. 【R语言进行数据挖掘】决策树和随机森林
  10. 将集合类转换成DataTable