信号基础
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回收