Unix C学习笔记14 信号基础,信号处理,太平间信号

信号基础

 

cd usr/include/x86/bits

vi signum.h

11号信号为段错误

kill -l命令可以查看所有信号

一共有62个信号,没有32和33,前31个为不可靠信号,后31个为可靠信号

9号进程必杀信号

11号段错误,核心已转储

转储代表产生转储文件,通过该文件得知程序为何终止

利用3号信号终止进程,ulimit -a查看限制,发现转储文件限制为0,无法产生转储文件

ulimit -c 1024修改转储文件大小 

 

 生成的转储文件core,通过vi查看为乱码,需要通过gdb corefile core查看

得知进程被3号信号终止

信号处理

捕获类似中断

signl函数

typedef void(*sighandler_t)(int);sighandler_t为函数指针的别名

typedef int* pint;pint为指针的别名

char *test();返回值为指针的函数

SIG_ERR为宏,值为-1

按ctrl+c发送2号信号被忽略 

signal第一次返回的是NULL

signal第二次返回的是对原信号上一次的处理方式,上一次为忽略处理

返回SIG_IGN,SIG_IGN为强转成指针类型的1,所以为0x1

按一次ctrl+c捕获一次 

signal扮演传话角色,告诉内核,有SIGINT信号到来时就调用sigfun函数,并将函数地址传给内核

内核完成函数的传参,调用,传的是信号的号数

第三次设置默认处理,返回上一次的处理方式的地址,即bigfun函数的地址

 

 

太平间信号

sigchld函数

首先父进程设置17号信号捕获,父进程创建5个子进程,父进程开始循环,子进程1秒死1个

父进程循环中1秒收到1个17号信号,内核调用信号处理函数收尸

编译,此处return为void类型,不应该跟值 

加上stdlib头文件使用exit函数

 

通过信号收尸

使信号处理函数睡3s,5个子进程死亡时间间隔非常短 

出现漏网僵尸

当信号处理函数在执行过程中,如果再有相同的多个信号到来,只保留一个,其他统统丢弃,所以出现信号丢失,收一次信号调一次wait

修改:收一次信号多调几次wait,多收几次,弥补信号丢失

 

因为wait的退出判断条件为没有子进程退出,所以还有子进程时会阻塞

等待老六结束才继续父进程

 

 用waitpid回收

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值