1. 進程概念
我們知道,每個進程在內核中都有一個進程控制塊(PCB)來維護進程相關的信 息,Linux內核的進程控制塊是task_struct結構體。現在我們全面了解一下其中都有哪 些信息。
- 進程id。系統中每個進程有唯一的id,在C語言中用pid_t類型表示,其實就是一個非 負整數。
- 進程的狀態,有運行、掛起、停止、僵尸等狀態。
- 進程切換時需要保存和恢復的一些CPU寄存器。
- 描述虛擬地址空間的信息。
- 描述控制終端的信息。
- 當前工作目錄(Current Working Directory)。
- umask掩碼。
- 文件描述符表,包含很多指向file結構體的指針。
- 和信號相關的信息。
- 用戶id和組id。
- 控制終端、Session和進程組。
- 進程可以使用的資源上限(Resource Limit)。
目前大家并不需要理解這些信息的細節,在隨后的文章中我們會知道它是保 存在PCB中的。
fork和exec是本章要介紹的兩個重要的系統調用。fork的作用是根據一個現有的進程復 制出一個新進程,原來的進程稱為父進程(Parent Process),新進程稱為子進程(Child Process)。系統中同時運行著很多進程,這些進程都是從最初只有一個進程開始一個一個 復制出來的。在Shell下輸入命令可以運行一個程序,是因為Shell進程在讀取用戶輸入的命 令之后會調用fork復制出一個新的Shell進程,然后新的Shell進程調用exec執行新的程序。
我們知道一個程序可以多次加載到內存,成為同時運行的多個進程,例如可以同時開多 個終端窗口運行/bin/bash,另一方面,一個進程在調用exec前后也可以分別執行兩個不同 的程序,例