系统相关
首页 > 系统相关> > Linux编程:信号

Linux编程:信号

作者:互联网

1.信号概念

  信号是软件中断,很多比较重要的应用程序都需要信号处理。信号是一种进程之间或者内核与进程间异步通信的一种机制,例如:用户在终端键入中断键,会通过信号机制停止一个程序。

2.信号的共性

3.信号的机制

  A给B发送信号,B 收到信号之前执行自己的代码,收到信号后,不管执行到程序的什么位置,都要暂停运行,去处理信号,处理完毕再继续执行。与硬件中断类似——异步模式。但信号是软件层面上实现的中断,早期常被称为“软中断”。
  信号的特质:由于信号是通过软件方法实现,其实现手段导致信号有很强的延时性。但对于用户来说,这个延迟时间非常短,不易察觉。

  每个进程收到的所有信号,都是由内核负责发送,内核处理

4.与信号相关的事件和状态

  产生信号:

  递达:递送并且到达进程。

  未决:产生和递达之间的状态。主要由于阻塞(屏蔽)导致该状态。

  信号的处理方式:

  linux内核的进程控制块PCB是一个结构体,包含了信号相关信息,主要指阻塞信号集和未决信号集。

  阻塞信号集:将某系信号加入集合,对他们设置屏蔽,当屏蔽x信号后,在收到该信号,该信号的处理将推后(解除屏蔽后)

  未决信号集:信号产生,未决信号集中该信号位立刻反转1,表示信号处于未决状态。当信号被处理对应位反转为0.这一刻往往非长短暂。

5.信号四要素

  在信号使用之前,要确定其四要素

  编号、名称、事件、默认处理动作

6.信号的产生

 7.信号集操作函数+原理(重)

    控制原理:内核通过读取未决信号集来判断信号是否应被处理。信号屏蔽字mask可以影响未决信号集。而我们可以再应用程序中自定义set来改变mask。以达到屏蔽指定信号的目的。(重点) 

  

 

    sigprocmask函数

      作用:用来屏蔽信号、解除屏蔽也是用该函数。其本质,读取或修改进程的信号屏蔽字(PCB中)

      

1 int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);   //成功:0;失败:-1,设置 errno
2 //set:传入参数,是一个位图,set 中哪位置 1,就表示当前进程屏蔽哪个信号。
3 //oldset:传出参数,保存旧的信号屏蔽集
4 //how 参数取值: 假设当前的信号屏蔽字为 mask
5 //SIG_BLOCK: 该进程新的信号屏蔽字是其当前信号屏蔽字和set指向信号集的并集。set包含了我们希望阻塞的附加信号。
6 //SIG_UNBLOCK: 该进程新的信号屏蔽字是其当前信号屏蔽字和set所指向信号集的补集的交集。set包含了我们希望解除阻塞的信号.
7 //SIG_SETMASK: 自定义set替换mask(mask表示系统自带的阻塞信号集)

    sigpending函数

      作用:读取当前进程的未决信号集

      

1 int sigpending(sigset_t *set);    //set 传出参数。 返回值:成功:0;失败:-1,设置 errno

8.信号捕捉

signal函数

  作用:注册一个信号捕捉函数(注册而非创建)

  原型:

1 sighandler_t signal(int signum, sighandler_t handler);
2 typedef void (*sighandler_t)(int);//函数指针类型 需要注意的就是需要传入一个整形参数 不管用不用

sigaction函数

  作用:修改信号处理动作(通常在Linux用来注册一个信号的捕捉函数)

  原型:

1 int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);
2 //act: 传入参数、新的处理方式
3 //oldact:  传出参数,旧的处理方式  

 9.信号捕捉特性(重)

10.内核实现信号捕捉过程

  

 

 11.SIGCHLD信号

  产生条件:

      子进程中止时

      子进程接收到SIGSTOP信号停止时

      子进程处在停止态,接收到SIGCONT后唤醒时

  借助该信号回收进程:

    子进程结束运行,其父进程会收到 SIGCHLD 信号。该信号的默认处理动作是忽略。可以捕捉该信号,在捕捉函数中完成子进程状态的回收。

标签:set,函数,int,编程,屏蔽,信号,Linux,进程
来源: https://www.cnblogs.com/chen-zj/p/16624994.html