layout | title | category | description | tags |
---|---|---|---|---|
post |
进程间的通信 |
基础 |
进程间的通信... |
信号量 |
Unix信号(signal)提供了把系统事件报告给进程的一种机制,每种事件都有一个编号,通常以符号常量来表示,比如SIGTERM,有两种系统事件:
- 异步通告:当用户在中断按下中断键,如CTRL-C,则向前台进程发出中断信号SIGINT。
- 同步错误或异常:当进程访问非法地址时,向进程发送一个SIGSEGV信号。
POSIX定义了大约20种不同的信号,其中有两种时用户自定义的,可以当作用户态下进程通信和同步的原语机制。
进程可以用两种方法来对待发送过来的信号:
- 忽略信号。
- 异步的执行一个指定的过程处理信号。
如果进程不指定何种方式,内核就根据信号的标号执行一个默认的操作,默认操作可能是:
- 中止进程。
- 将执行上下文和地址空间内容写入一个文件。
- 忽略信号。
- 挂起进程。
- 如果进程曾经被暂停,则恢复执行。
另外,SIGKILL和SIGSTOP信号不能由进程直接处理,也不能忽略。很多Unix内核采用了信号量、消息队列及共享内存,它们被统称为System V IPC。
内核把它们作为IPC资源来实现:进程要获得一个资源,可以调用shmget()、semset()或msgget()系统调用。与文件一样,IPC资源是恒久不变的,进程创建者、拥有者或者超级用户进程必须显式的释放这些资源。