该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
用户进程对信号的响应方式有以下三种:
1、缺省操作,linux对每种信号都规定了默认操作,如果没有特殊说明,就按照默认的方式执行。
2、忽略信号:对信号不做处理,假装看不见,但是有两个信号不能忽略,即SIGKILL和SIGSTOP。
3、捕捉信号:捕捉响应的信号,进行函数处理。SIGKILL和SIGSTOP也不可以捕捉。
使用信号的场合:
普通用户只能给自己创建的进程发信号,超级用户可以给所有进程发信号,没有限制。
以下是系统内部的一些信号的功能总结:
SIGHUP:当终端关闭的时候,shell以及在shell下运行的所有进程,不管前后台,只要跟终端关联,(守护进程和终端不关联。)都会终止。
SIGINT:ctrl+c按下后,它会发给当前终端下的前台进程。死循环,就是按这个结束的。
SIGQUIT:ctrl+\,和SIGINT类似。
SIGILL:遇到了非法指令,磁盘上有坏块,cpu无法正常译码。
SIGFPE:发生致命的算术运算,除0操作。程序终止。
SIGKILL:用来结束程序运行,级别很高,不能忽略和捕捉。任何一个进程受到这个信号的时候只能终止。
SIGALRM:定时器,设置一个闹钟,时间到了,会发这个信号,默认操作时终止进程。一般来说我们用的话都是用捕捉的响应方式。
SIGSTOP、SIGTSTP:都让进程处于停止态,区别是SIGSTOP级别高,不能忽略,不能捕捉,而SIGTSTP级别低,可以忽略可以捕捉。
SIGCHLD:子进程改变状态的时候,父进程会收到这个信号。(子进程由运行态变为停止态,或子进程结束的时候,父进程会收到这个信号。)默认是空操作,不是忽略。
处理僵尸进程:(1)、wait操作。(2)、父进程里忽略这个信号。(3)捕捉这个信号,用waitpid(-1,NULL,WNOHANG)非阻塞方式。
这里主要说一下捕捉信号的方法:
调用signal函数。
函数原型:Void(*signal(int signum,void(*hanler)(int)))(int);
功能:设置信号的响应方式,把一个函数和一个信号关联起来,并没有发信号。不会有信号产生,不会阻塞。
参数:第一个参数是一个信号。
第二个参数是一个函数指针。指向一个有整形的参数,无返回值的函数。
Signal函数也是一个类似第二个参数类型的函数指针,指向一个有整形的参数,无返回值的函数。
使用示例:
Signal(SIGINT,handler);
Void handler(int sign_no)
{
信号的处理。
}