linux子进程无法捕获信号,【华清远见】用户进程对信号的响应方式

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

用户进程对信号的响应方式有以下三种:

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)

{

信号的处理。

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值