用户进程对信号的响应方式一
时间:2016-12-14作者:华清远见
用户进程对信号的响应方式有以下三种: 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函数也是一个类似第二个参数类型的函数指针,指向一个有整形的参数,无返回值的函数。 使用示例: 发表评论
|