?前言
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
🎬 個人主頁:@ChenPi
🐻推薦專欄1: 《C++_@ChenPi的博客-CSDN博客》????
🔥 推薦專欄2: 《Linux C應用編程(概念類)_@ChenPi的博客-CSDN博客》???
🛸推薦專欄3: ??????《鏈表_@ChenPi的博客-CSDN博客 》 ???
🌺本篇簡介 ?:? 這一章我們學習一下Linux中非常重要的一部分——進程
Linux 是一個多用戶多任務的操作系統,每個用戶可以同時運行多個程序
進程是程序運行的主體,包括進程的創建,調度和消亡的整個過程
當用戶執行一個指令或者啟動一個程序時,就創建了一個進程
一個運行的程序也可能有多個進程。
每個進程將被分配各種資源? ? ? ? ? ?
01 Linux 下的進程控制塊(PCB)
進程是Linux系統的基本調度單位。在Linux系統中,進程是通過進程控制塊來描述的。
在Linux進程控制塊由task_struct數據結構實現,它記錄了以下幾個類型的信息:
- 狀態信息。例如,這個進程處于可執行狀態、休眠、掛起等。
- 性質。由于Linux有很多變種,進程有自己獨特的性質。
- 資源。資源的鏈接,如內存,還有資源的限制和權限等。
- 組織。例如,按照家族關系建立起來的樹(父進程,子進程等)。
每個進程用一個task struct數據結構來表示。
數組task包含指向系統中所有task_struct結構的指針。
系統中的最大進程數目受task數組大小的限制,默認值一般為512。
創建新進程時,Linux將從系統內存中分配一個task_struct結構并將其加入task數組。
如果想看這個結構體可以進入下面鏈接
Linux PCB(進程控制塊) 詳解-CSDN博客
我覺得講的也很清楚
當前運行進程的結構用current 指針來指示。
進程控制塊(Process Control Block,PCB)是用來記錄進程狀態及其他相關信息的數據結構。
PCB是進程存在的唯一標志,PCB存在則進程存在。
系統創建進程時會產生一個 PCB,撤銷進程時,PCB也自動消失。
2.進程的標識
PCB的內容豐富,其中的進程標識包括進程號、用戶標識、用戶組標識、進程時間、資源利用情況等。
這里只介紹其中最主要的進程號,也就是PID。
PID唯一的標識一個進程。除了進程的PID外,進程的父進程號(PPID)也是一個主要的標識。
當父進程終止時,子進程也隨之而終止。
但子進程終止,父進程并不一定終止。
PID 和 PPID都是一個非零正整數。
在Linux中可以通過系統調用getpid 得到進程的 ID,
而getppid可以得到父進程(創建調用該函數進程的進程)的ID。
03獲取進程PID號 —— getpid()
Linux 系統下的每一個進程都有一個進程號(process ID,簡稱 PID),
進程號是一個正數,用于唯一標 識系統中的某一個進程。
在應用程序中,可通過系統調用 getpid()來獲取本進程的進程號,其函數原型如下所示:
#include <sys/types.h>?
#include <unistd.h>?pid_t getpid(void);?
返回值: 成功返回當前進程的ID號,失敗返回-1
應用代碼測試:
#include <stdio.h>?
#include <stdlib.h>?
#include <sys/types.h>?
#include <unistd.h>?int main(void)?{?pid_t pid = getpid();?printf("本進程的 PID 為: %d\n", pid);?exit(0);?}?
ps aux|grep ./a.out
通過PS指令我們可以看到我們運行的./a.out的這個進程是9910
然后我們看我們代碼打印出來的數字,也是9910
所以getpid這個系統調用是返回當前進程的ID號
04 getppid()獲取父進程PID號
除了 getpid()用于獲取本進程的進程號之外,還可以使用 getppid()系統調用獲取父進程的進程號,其函 數原型如下所示:
#include <sys/types.h>?
#include <unistd.h>?pid_t getppid(void);?
返回值:返回父進程的PID號?
#include <stdio.h>?
#include <stdlib.h>?
#include <sys/types.h>?
#include <unistd.h>?int main(void)??
{?pid_t pid = getpid(); //獲取本進程 pid?printf("本進程的 PID 為: %d\n", pid);?pid = getppid(); //獲取父進程 pid?printf("父進程的 PID 為: %d\n", pid);?exit(0);?}?
?
所以到底是不是這樣呢?
我們使用KILL 指令試一下,看把終端殺了會怎么樣
可以看到程序的父進程是終端,因為這個程序是依托于終端運行的?
所以它的父進程是終端,父進程被殺死后,程序也停止運行了