進程是作業系統資源分配與調度的基本單位。理解 Linux 進程生命週期、創建機制 (fork/exec)、父子關係、終止回收、線程實現,是系統編程、性能調優、故障診斷的基石。本文構建完整知識圖譜。
nginx master + 多 worker),相互隔離。execl, execv, execlp, execvp, execle, execve (l=列表, v=向量, p=PATH搜索, e=環境變量)。FD_CLOEXEC)。// Shell 進程
pid = fork();
if (pid == 0) { // 子進程
execvp("ls", {"ls", "-l", NULL});
perror("exec failed"); // exec 失敗才執行這裡
_exit(1);
} else if (pid > 0) { // 父進程
waitpid(pid, &status, 0); // 回收子進程
} else {
perror("fork failed");
}
/proc/sys/kernel/pid_max 可調)。查看:ps -eo pid,ppid,pgid,sid,uid,euid,cmd、pstree -p、cat /proc/PID/status。
exit(n) / return n (main) / _exit(n) (直接系統調用,不刷緩衝區/調用 atexit)。EXIT_ZOMBIE 狀態,向父進程發送 SIGCHLD。wait(&status):阻塞等待任意子進程終止,回收 PCB,獲取退出信息。waitpid(pid, &status, options):指定 PID、非阻塞 (WNOHANG)、支持作業控制。waitid():更現代、靈活。原因:子進程終止,父進程未調用 wait 回收。PCB 殘留佔用 PID、內核內存。ps 顯示 Z 狀態 (defunct)。
危害:大量僵屍耗盡 PID 池,導致無法創建新進程。
清理:殺死父進程 → 子進程成為孤兒 → 被 init (PID 1) 收養 → init 循環 wait 清理。或重啟系統。
原因:父進程先於子進程終止。
歸宿:內核將其 PPID 設置為 1 (init/systemd) 或子再啟動器 (subreaper, prctl(PR_SET_CHILD_SUBREAPER))。init 負責回收,無害。
clone() 系統調用:CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND | CLONE_THREAD 創建線程。getpid() 返回 TGID,gettid() 返回內核 TID。/proc/PID/
├── cmdline # 啟動命令行 (空格用 \0 分隔)
├── environ # 環境變量 (\0 分隔)
├── fd/ # 文件描述符符號鏈接
├── maps # 內存映射區域
├── status # 狀態信息 (State, PPid, Uid, VmRSS, Threads...)
├── stat # 統計信息 (CPU 時間、上下文切換、頁錯誤...)
├── io # I/O 統計
├── limits # 資源限制
├── cwd -> /pwd # 當前工作目錄
├── exe -> /path # 可執行文件
└── root -> / # 根目錄 (chroot 影響)
Linux 進程以 fork() 複製創建、exec() 載入程序、wait() 回收終止,構建以 init 為根的進程樹。線程是共享資源的輕量級進程。掌握 fork/exec/wait 模式、僵屍/孤兒機制、/proc 觀測、ps/pstree/top/htop 分析工具,是 Linux 開發運維的核心基本功。
