Skip to content

Latest commit

 

History

History
30 lines (22 loc) · 1.51 KB

2014-03-17-signal.md

File metadata and controls

30 lines (22 loc) · 1.51 KB
layout title category description tags
post
进程间的通信
基础
进程间的通信...
信号量

Unix信号(signal)提供了把系统事件报告给进程的一种机制,每种事件都有一个编号,通常以符号常量来表示,比如SIGTERM,有两种系统事件:

  1. 异步通告:当用户在中断按下中断键,如CTRL-C,则向前台进程发出中断信号SIGINT。
  2. 同步错误或异常:当进程访问非法地址时,向进程发送一个SIGSEGV信号。

POSIX定义了大约20种不同的信号,其中有两种时用户自定义的,可以当作用户态下进程通信和同步的原语机制。

进程可以用两种方法来对待发送过来的信号:

  1. 忽略信号。
  2. 异步的执行一个指定的过程处理信号。

如果进程不指定何种方式,内核就根据信号的标号执行一个默认的操作,默认操作可能是:

  1. 中止进程。
  2. 将执行上下文和地址空间内容写入一个文件。
  3. 忽略信号。
  4. 挂起进程。
  5. 如果进程曾经被暂停,则恢复执行。

另外,SIGKILL和SIGSTOP信号不能由进程直接处理,也不能忽略。很多Unix内核采用了信号量、消息队列及共享内存,它们被统称为System V IPC

内核把它们作为IPC资源来实现:进程要获得一个资源,可以调用shmget()、semset()或msgget()系统调用。与文件一样,IPC资源是恒久不变的,进程创建者、拥有者或者超级用户进程必须显式的释放这些资源。