信号
信号的概念和机制
产生信号的方式
bg命令 :后台
fg命令:将后台执行恢复到前台
信号四要素和常规信号
常规信号一览表
kill函数和kill命令
alarm函数
一秒之后就会停下
setitimer函数
信号集操作函数
/*************************************************************************
> File Name: pipe_test.c
> Author: shaozheming
> Mail: 957510530@qq.com
> Created Time: 2022年02月27日 星期日 11时19分51秒
************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <pthread.h>
#include <fcntl.h>
#include <signal.h>
void sys_err(const char *str)
{
perror(str);
exit(1);
}
void print_set(sigset_t *set)
{
int i;
for(i = 1; i < 32;++i){
if(sigismember(set, i))
putchar('1');
else
putchar('0');
}
printf("\n");
}
int main(int argc, char* argv[])
{
sigset_t set, oldset, pendset; //定义一个信号集
int ret = 0;
sigemptyset(&set); //将信号集清空
sigaddset(&set, SIGINT);//将ctrl+c加入信号集
ret = sigprocmask(SIG_BLOCK, &set, &oldset);
if(ret == -1)
sys_err("sigprocmask error!\r\n");
while(1){
ret = sigpending(&pendset);
if(ret == -1)
sys_err("sigpending error!\r\n");
print_set(&pendset);
}
return 0;
}
信号捕捉
五个成员,第二个成员如果传递结构体用这个
第三个mask只作用于信号捕捉执行期间,会暂时覆盖掉PCB里的mask,执行完了再恢复
第四个参数是为0,是默认屏蔽
4->5步骤,是因为内核调用函数,需要最后返回给内核,所以又回去内核了
借助信号捕捉回收子进程
子进程只要变化都会产生signhld信号
注意下面代码会产生僵尸进程
原因是:同一个信号发送了很多次,就是同时间死亡的子进程,但是信号只处理一次,所以会出现四个僵尸进程
改进方法:
慢速系统中断调用
主要是给自己看的,所以肯定会出现很多错误哈哈哈哈哈