步骤 6 / 6
孤儿进程与信号
父进程先走了,孩子由别的进程收养;进程之间还能用信号打招呼。
如果父进程先退出,子进程就成了“孤儿”,内核把它过继给 init(systemd,PID 1)或指定的“收养者”,由它负责 wait 回收。 进程之间可以发信号:Ctrl+C 发 SIGINT,kill 默认发 SIGTERM,子进程结束时父进程会收到 SIGCHLD。 进程可以自己处理大多数信号,但 SIGKILL 无法捕获,一定会被杀掉。
操作系统
在终端敲下一个命令,bash 是怎样把它变成一个新运行的程序的。
以在 Linux 的 bash 里输入 ls 为例。
步骤 6 / 6
父进程先走了,孩子由别的进程收养;进程之间还能用信号打招呼。
如果父进程先退出,子进程就成了“孤儿”,内核把它过继给 init(systemd,PID 1)或指定的“收养者”,由它负责 wait 回收。 进程之间可以发信号:Ctrl+C 发 SIGINT,kill 默认发 SIGTERM,子进程结束时父进程会收到 SIGCHLD。 进程可以自己处理大多数信号,但 SIGKILL 无法捕获,一定会被杀掉。
| 当前状态 | 发生了什么 |
|---|---|
| bash 运行中 | 用户输入 ls,bash 需要启动一个新程序 |
| 父子两个进程 | 内核复制出子进程 |
| 子进程运行 ls | 子进程变成了 ls |
| bash 等待中 | 父进程睡眠,等待子进程 |
| bash 继续运行 | 子进程被回收,显示下一个提示符 |
| 回收 | 孤儿被 init 收养并回收 |