- ·上一篇文章:Linux系统如何在Git里撤销操作
- ·下一篇文章:Linux虚拟机的设备id与盘符不相符怎么办?
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信号机制解析