Windows XP Windows 7 Windows 2003 Windows Vista Windows 綜合教學 Linux 系統教學
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟體教學

Linux 進程核心概念深度解析:從靜態程式碼到動態實體、PCB、fork/exec、僵屍進程與 init 收養機制

編輯:Linux 系統常見問題解答

什麼是進程?

程式碼靜態存放於磁碟,載入記憶體獲得生命,由 CPU 動態執行。為管理多進程並行,核心為每個進程建立 PCB (Process Control Block,任務控制塊),包含:

  • PID (唯一識別碼,pid_t)
  • 狀態 (Running、Sleeping、Stopped、Zombie)
  • CPU 寄存器現場
  • 虛擬記憶體描述符
  • 控制終端、當前工作目錄 (CWD)、umask
  • 檔案描述符表 (指向 file 結構體)
  • 訊號處理資訊
  • UID/GID、Session/PGID
  • 資源上限 (RLIMIT)

進程創建:fork + exec

  1. fork():複製父進程 PCB、分配記憶體、複製程式碼段 (唯讀共享)、複製資料段 (私有 Copy-on-Write)。
    返回值:父進程得子進程 PID、子進程得 0、失敗 -1。
  2. exec() 族函數:子進程調用,以新程式映像完全取代原程式碼,從新程式 main() 開始執行。PID 不變,成功不返回,失敗返回 -1。
    典型模式:if ((pid = fork()) == 0) { execl(...); }

進程終止與清理

  • 正常終止:關閉檔案描述符、釋放使用者空間記憶體、PCB 保留退出狀態。
  • 異常終止:PCB 保留終止訊號。
  • 父進程呼叫 wait() / waitpid() 讀取狀態並徹底釋放 PCB。
  • Shell 為前景進程父進程,自動 wait 並將退出碼存入 $?。

僵屍進程與 init 收養

  • 進程終止但父進程未 wait → 僵屍狀態 (Z)。kill 無效 (已死)。解決:kill 父進程 → 進程被 init (PID 1) 收養 → init 週期性 wait 清理。
  • 父進程先終止 → 子進程由 init 收養 (無論存活或僵屍)。

wait/waitpid 原型

pid_t wait(int *status);
pid_t waitpid(pid_t pid, int *status, int options);

返回清理的子進程 PID,錯誤 -1。父進程呼叫時可能阻塞 (子進程皆執行中)、立即返回 (有僵屍子進程)、錯誤 (無子進程)。

Copyright © Windows教程網 All Rights Reserved