當你在終端(shell)中運行一個可執行程序,誰是它的父進程?

衆所周知,在Linux系統中,所有的進程都是有父子或者堂兄關係的,除了初始進程init,沒有任何進程是完全獨立的。

除了init進程,系統中每個進程都會有一個父進程,新的進程不是被全新創建的,而是複製父進程的現有資源而生成的。

當我們在shell下運行一個可執行程序,就產生了一個新的進程。那麼,問題來了,誰是這個新的進程的父進程?

首先看看下面的代碼:

#include <iostream>                                                                                                                           
#include <sys/types.h>
#include <unistd.h>
using namespace std;
int main()
{ 
    while(1)
    { 
        pid_t pid = getpid();	// 獲取當前進程ID
        pid_t fpid = getppid(); // 獲取父進程ID
        cout << "pid = " << pid << endl;
        cout << "ppid = " << fpid << endl;
        cout << "=================" << endl;
        sleep(5);  // 每隔5s打印一次
    } 
    return 0;                                                                                                                                 
} 

以上的程序實現每隔5s打印當前程序的PID號和父進程的PID號,使用g++編譯成可執行文件,在shell下執行:
在這裏插入圖片描述
可以看到,程序已經成功的執行,並且打印當前進程PID和父進程的PID。此時,我們知道當前進程確實存在父進程,而且PID號也已經知曉。但是,這個父進程到底是誰呢?知道個號碼也不知道其身份呀。

這個時候,讓程序繼續執行,我們打開另一個shell,執行pstree命令。pstree命令是查看系統中運行的進程之間的關係。

如圖,pstree執行結果的一部分截圖:在這裏插入圖片描述
我們在pstree的查詢結果中,找到當前可執行程序的名稱,就能知道它所屬的父進程是誰。
在這裏插入圖片描述

如上圖,我們可以知道,當前可執行程序test,它的父進程是fish,fish是shell中的一種,類似於bash。(推薦大家安裝使用哦,挺好用的)。

所以,當我們在終端中運行一個可執行程序,它的父進程就是當前運行的shell程序。

另外,重要的一點,我們可以使用pstree查看系統中所有進程的關係。

謝謝閱讀。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章