进程间通讯

IPC全称Interprocess Communication,指进程间协作的各种方法,当然包括共享内存,信号量或Socket等。
  1. 管道(Pipe):管道是进程间通信最简单的方式,任何进程的标准输出都可以作为其他进程的输入。
  2. 信号(Signal):下面马上会介绍。
  3. 消息队列(Message):和传统消息队列类似,但是在内核实现的。
  4. 共享内存(Shared Memory):后面也会有更详细的介绍。
  5. 信号量(Semaphore):信号量本质上是一个整型计数器,调用wait时计数减一,减到零开始阻塞进程,从而达到进程、线程间协作的作用。
  6. 套接字(Socket):也就是通过网络来通信,这也是最通用的IPC,不要求进程在同一台服务器上。

信号

我们知道信号是进程间通信的其中一种方法,当然也可以是内核给进程发送的消息,注意信息只是告诉进程发生了什么事件,而不会传递任何数据。

这是进程这个概念设计时就考虑到的了,因为我们希望控制进程,就像一个小孩我们想他按我们的想法做,前提就是他能够接受信号并且理解信号的含义。

信号种类

Linux中定义了很多信号,不同的Unix-like系统也不一样,我们可以通过下面的命令来查当前系统支持的种类。

➜ kill -l
HUP INT QUIT ILL TRAP ABRT EMT FPE KILL BUS SEGV SYS PIPE ALRM TERM URG STOP TSTP CONT CHLD TTIN TTOU IO XCPU XFSZ VTALRM PROF WINCH INFO USR1 USR2

其中1至31的信号为传统UNIX支持的信号,是不可靠信号(非实时的),32到63的信号是后来扩充的,称做可靠信号(实时信号)。不可靠信号和可靠信号的区别在于前者不支持排队,可能会造成信号丢失,而后者不会。

简单介绍几个我们最常用的,在命令行中止一个程序我们一般摁Ctrl+c,这就是发送SIGINT信号,而使用kill命令呢?默认是SIGTERM,加上-9参数才是SIGKILL。

编程实例

import os/signal
siganl.Notify()
signal.Stop()

这是Go封装的信号接口,我们可以以此实现一个简单的信号发送和处理程序。

下一节:进程的概念大家都很熟悉,但你是否能准确说出僵尸进程的含义呢?还有COW(Copy On Write)、Flock(File Lock)、Epoll和Namespace的概念又是否了解过呢?