1. 进程控制

每个进程都有一个唯一的正数进程 ID(PID)。

从程序员的角度,可以认为进程总是处于下面三种状态之一:

  • 运行。进程要么在执行,要么等待被执行。
  • 停止。进程的执行被挂起,且不会被调度。
  • 终止。进程永远地停止了。

父进程通过 fork 函数创建一个新运行的子进程,新创建的子进程几乎但不完全与父进程相同,它们之间的最大区别是有不同的 PID。

当一个进程由于某种原因终止时,进程保持一种终止的状态,直到被它的父进程回收。

execve 函数在当前进程的上下文中加载并运行一个新程序。

2. 信号

一个信号就是一条消息,它通知进程系统中发生某种类型的事件。

传递一个信号到目的进程是由两个步骤组成的:

  • 发送信号:内核通过更新目的进程上下文中的某个状态,发送一个信号给目的进程。
  • 接收信号:当目的进程被内核强迫以某种方式对信号的发送做出反应时,它就接收了信号。
信号处理

Unix 系统提供了大量的进程发送信号机制,这些机制都是基于进程组这个概念。每个进程只属于一个进程组,
进程组由一个正整数 ID 标识。默认地,子进程和它的父进程属于同一个进程组。

当内核把进程 p 从内核模式切换到用户模式时,它会检查进程 p 的未被阻塞的待处理信号集合,如果集合为空,那么内核将控制传递到 p 的逻辑控制流的下一条指令。如果集合非空,那么内核选择集合中的某个信号 k,并且强制 p 接收 k。收到这个信号会触发进程采取某种行为。一旦进程完成了这个行为,那么控制就传递回 p 的逻辑控制流的下一条指令。