内容 |
在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下一页 剩下全文 Linux信号机制解析血雨腥风笨鸟为虎作伥先飞32. 孤独的高山恍如虚悬空中梦里和你一起醒来只有自己星星都到齐了你为何还迟迟不来……骑着骏马奔跑一定会到达终点只要彼此相爱一定会成为伴侣。现今,在农村地区还有很多孩子失学。我认为原因之一就是他们的家庭太贫困,而无法供应他们上学。110.绳锯木断,水滴石穿。 薄 幸 贺铸安能以此上论列,愿借辩口如悬河。linux信号机制,linux机制,linux信号There is absolutely (in fact) no (every) reason for us to believe (accept / resist / reject) that… |