Linux之信号

浅谈Linux信号

1、信号:通知进程发送了某种事件;

2、发送信号(kill)->进程->响应信号(signal);

3、kill函数发送信号:系统调用
int kill(pid_t pid,int signum)
kill函数的两个参数:pid(目标进程的pid),signum(向目标进程发送的信号);信号发送失败则返回-1;

4、signal函数处理信号:系统调用
typedef void (*sighandler_t)(int);
signal(int signum,sighandler_t handler);
第一个参数:signum:接收到的信号类型,为整数;
第二个参数:handler:函数指针;handler是指向一个函数,该函数的参数为int,返回类型为void;
signal函数接收到信号sig,会调用handler指向的函数处理接收到的信号,该函数的参数为接收到的信号,
最后signal函数返回函数指针,和先前处理信号的函数类型相同;

5、信号的响应:
忽略(SIG_IGN):对信号不做任何处理,SIGKILL和SIGSTOP不能忽略;
默认(SIG_DFL):执行系统默认操作;
自定义fun:捕捉信号,定义信号处理函数,当信号发生时,执行相应的处理函数;
SIGKILL和SIGSTOP信号不能忽略和捕获;

6、信号名称:
(1)、SIGINT(2):终端中断;默认下用户在键盘输入Ctrl+c发送了信号为2的终端中断信号;
(2)、SIGKILL (9):杀死一个进程,强制结束一个进程;不许改变响应方式,只能按默认操作结束一个进程;
前面的Linux命令中kill -9 pid结束进程;给进程发送了一个信号为9的结束进程的信号;
(3)、SIGTERM (15): 结束进程;该信号可以被处理;
(4)、SIGSTOP (20): 停止进程的执行,进程还未结束,只是暂停执行;不能改变响应方式;ctrl+z;
(5)、SIGCHLD(17):子进程结束或退出,给父进程发送信号,信号为17,父进程接收到信号默认忽略,父进程继续运行但不会处理僵尸进程;
重点:僵尸进程的处理:
1:可以利用信号SIGCHLD来处理僵尸进程,也不会造成父进程阻塞,通过wait处理在Linux和Unix上都可以;
将接收到的信号SIGCHLD用信号处理函数signal(SIGCHLD,fun),调用函数fun处理信号时调用wait解决僵尸进程;
void fun( int sig)
{
printf(“sig=%d\n”,sig);
int val;
wait(&val);
}
2:直接将接收到的信号signal(SIGCHLD,SIG_IGN)设置为忽略,linux系统会自动处理僵尸进程,但只在Linux下适用;

7、当程序莫名其妙的退出时,多半是程序接收到了信号;

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值