信号

信号的概念和机制

image
image

产生信号的方式

image
bg命令 :后台
fg命令:将后台执行恢复到前台
image
image
image
image

信号四要素和常规信号

image

常规信号一览表

image
image
image
image

kill函数和kill命令

image
image
image

alarm函数

image
image
一秒之后就会停下

setitimer函数

image
image
image
image
image

信号集操作函数

image
image
image
image

/*************************************************************************
  > 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;
}

信号捕捉

image
image
image
image
五个成员,第二个成员如果传递结构体用这个
第三个mask只作用于信号捕捉执行期间,会暂时覆盖掉PCB里的mask,执行完了再恢复
第四个参数是为0,是默认屏蔽
image
image
image
4->5步骤,是因为内核调用函数,需要最后返回给内核,所以又回去内核了

借助信号捕捉回收子进程

image
子进程只要变化都会产生signhld信号
image
image
注意下面代码会产生僵尸进程
image
原因是:同一个信号发送了很多次,就是同时间死亡的子进程,但是信号只处理一次,所以会出现四个僵尸进程
改进方法:
image
image
image

慢速系统中断调用

image

posted @ 2022-02-28 19:49  蘑菇王国大聪明  阅读(155)  评论(0编辑  收藏  举报