网站首页 软件下载 游戏下载 翻译软件 电子书下载 电影下载 电视剧下载 教程攻略 音乐专区
霍普软件下载网-旗舰软件下载站,将绿色免费商业版破解软件、共享软件、游戏、电影、电视剧一网打尽!
| 文章 | Linux信号机制解析 |
| 分类 | 教程攻略 |
| 语言 | zh-CN |
| 大小 | |
| 版本 | |
| 下载 |
|
| 介绍 |
在Linux中信号也称为软中断,进程在收到信号之后在对信号进行处理,可以说就是一个中断的过程。本文就来为大家简单地解析一下Linux信号机制。 ![]() 1、安装信号处理函数 在系统编程的层面村夫俗子拼音:cūn fū sú zǐ释义:指粗野鄙俗的人。出处:明·胡文焕《群音类先〈赛四节记·踏雪寻梅〉》今朝乐事古应稀,数瓯满饮,休负明时,村夫俗子,枉营营岂知滋味。”示例:无上与信号的处理关系最直接相关的函数有两个,他们用来安装信号处理函数: 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 } 上一页12下一页 剩下全文 |
| 截图 | |
| 随便看 |
|
免责声明
本网站所展示的内容均来源于互联网,本站自身不存储、不制作、不上传任何内容,仅对网络上已公开的信息进行整理与展示。
本站不对所转载内容的真实性、完整性和合法性负责,所有内容仅供学习与参考使用。
若您认为本站展示的内容可能存在侵权或违规情形,请您提供相关权属证明与联系方式,我们将在收到有效通知后第一时间予以删除或屏蔽。
本网站对因使用或依赖本站信息所造成的任何直接或间接损失概不承担责任。联系邮箱:101bt@pm.me