当前位置: > 华清远见教育科技集团 > 嵌入式学习 > 讲师博文 > 用户进程对信号的响应方式一
用户进程对信号的响应方式一
时间: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函数也是一个类似第二个参数类型的函数指针,指向一个有整形的参数,无返回值的函数。

使用示例:
        Signal(SIGINT,handler);
        Void handler(int sign_no)
        {
                信号的处理。
        }

发表评论
评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)