Linux系统编程——信号

本文介绍了信号在操作系统中的作用,包括信号的产生、递达状态、处理方式如默认动作、忽略和捕获。提到了kill命令用于发送信号,以及alarm和setitimer函数实现定时器功能。同时讨论了信号集的操作和信号屏蔽,以及信号捕获在管理进程中的应用。
摘要由CSDN通过智能技术生成

1.信号

  • 信号共性:
    简单、不能携带大量信息、满足条件才发送。
  • 信号的特质:
    信号是软件层面上的“中断”。一旦信号产生,无论程序执行到什么位置,必须立即停止运行,处理信号,处理结束,再继续执行后续指令。所有信号的产生及处理全部都是由【内核】完成的。

信号相关的概念:

  • 产生信号:
    1.按键产生
    2.系统调用产生
    3.软件条件产生
    4.硬件异常产生
    5.命令产生概念:
  • 未决:产生与递达之间状态。
  • 递达:产生并且送达到进程。直接被内核处理掉。
  • 信号处理方式:执行默认处理动作、忽略、捕捉(自定义)
  • 阻塞信号集(信号屏蔽字):本质:位图。用来记录信号的屏蔽状态。一旦被屏蔽的信号,在解除屏蔽前,一直处于未决态。
  • 未决信号集:本质:位图。用来记录信号的处理状态。该信号集中的信号,表示,已经产生,但尚未被处理。

在这里插入图片描述

2.信号四要素:

信号使用之前,应先确定其4要素,而后再用!!!
信号编号、信号名称、信号对应事件、信号默认处理动作。

3.kill命令和kill函数:

int kill (pid_t pid, int signum)
pid:

0 :发送信号给指定进程
=0 :发送信号给跟调用kill函数的那个进程处于同一进程组的进程。
<-1:取绝对值,发送信号给该绝对值所对应的进程组的所有组员。
= -1、发送信号给,有权限发送的所有进程。
signum:待发送的信号
返回值:
成功:0
失败:-1 errno

4.alarm函数:

定时发送SIGALRM给当前进程。

unsigned int alarm(unsigned int seconds) ;

seconds:定时秒数返回值:上次定时剩余时间.

5.setitimer函数

  • int setitimer(int which,const struct itimerval *new_value,struct
    itimerval *old_value);

  • 参数:
    new_value:定时秒数

  • 类型:

     struct itimerval {
     	struct timeval {
     		time_t		tv_sec;     			/*seconds */
     		suseconds_t	 tv_usec;		/* microseconds */
     	}it_interval ;
     	struct timeval{
     		time_ttv_sec;						/*seconds */
     		suseconds_t tv_usec;			/*microseconds */
     	}it_value;
     };
    
  • old_value:传出参数,上次定时剩余时间。

  • e.g. :

     struct itimnerval new_t;
     struct itimerval old_t;
     new_t.it_interval.tv_sec = 1;
     new_t.it_interval.tv_usec = 0;
     new_t.it_value.tv_sec = 0;
     new_t.it_value.tv_usec = 0;
     setitimer(&new_t,&old_t)
    
  • 返回值:
    成功:0
    失败:-1 errno

6.信号集操作函数:

	sigset_t set;自定义信号集。
	sigemptyset(sigset_t *set);清空信号集
	sigfillset(sigset_t *set);全部置1
	sigaddset(sigset_t *set, int signum);将一个信号添加到集合中
	sigdelset(sigset_t *set, int signum);将一个信号从集合中移除
	sigismember (const sigset_t *set,int signum);判断一个信号是否在集合中。在1,不在0

设置信号屏蔽字和解除屏蔽:

	int sigprocmask(int how,const sigset_t *set,sigset_t *oldset);
		how :		SIG_BLOCK:设置阻塞
					SIG_UNBLOCK:取消阻塞
					SIG_SETMASK :用自定义set替换mask。
		set:		自定义set
		oldset:		旧有的mask。

信号捕捉:
signal();
sigaction();
信号捕捉特性:
1.捕捉函数执行期间,信号屏蔽字由mask --> sa_mask ,捕捉函数执行结束。恢复回mask
2.捕捉函数执行期间,本信号自动被屏蔽(sa_flgs = 0).
3.捕捉函数执行期间,被屏蔽信号多次发送,解除屏蔽后只处理
-次!

在这里插入图片描述

在这里插入图片描述
借助信号捕捉回收子进程:
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Strive_LiJiaLe

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值