信号


信号的概念和机制


产生信号的方式


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 
#include 
#include 
#include 
#include 
#include 
#include 

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信号


注意下面代码会产生僵尸进程

原因是:同一个信号发送了很多次,就是同时间死亡的子进程,但是信号只处理一次,所以会出现四个僵尸进程
改进方法:


慢速系统中断调用