Linux程序分析(二) 父子程序與程序組

2021-08-26 12:32:46 字數 2013 閱讀 9022

ps命令一般用來顯示終端資訊和程序資訊,執行命令ps -eo pid,comm,cmd可以輸出所有程序的資訊,e代表所有程序,後面三個引數是需要輸出的資訊。

第一列pid是乙個整數,每乙個程序都有乙個唯一的pid來代表自己的身份,程序也可以根據pid來識別其他的程序。第二列command是這個程序的簡稱。第三列cmd是程序所對應的程式以及執行時所帶的引數。

pid為1的程序是systemd,執行/sbin/init後出現。如果執行ps aux命令,可以看到第乙個程序就是init

計算機啟動時,只有乙個根程序init,可以通過命令pstree檢視。linux建立新程序用的是fork機制,所有程序都是從init程序fork而來,也就是說linux程序是個樹形結構。目前systemd取代了initd,成為系統的第乙個程序(pid=1),其他程序都是它的子程序。根據 linux 慣例,字母d是守護程序(daemon)的縮寫。 systemd 這個名字的含義,就是它要守護整個系統。

fork複製老程序產生了新程序,它在記憶體中開闢一段空間供子程序使用,並將老的程序空間中的內容複製到新的空間中,此後兩個程序同時執行。老程序被稱為父程序,新程序為子程序,linux提供了ppid表示某程序的父程序id。fork函式返回型別為pid_t,實質為unsigned int,而且有兩次返回,一次返回子程序id給父程序,一次返回0給子程序。

父子程序的相同之處:使用者id,宿主工作目錄,工作目錄,**段、棧堆、環境變數等等。

父子程序的不同之處:程序pid,ppid,fork返回值,程序執行時間,定時器。

父子程序間遵循**讀時共享寫時複製**的原則,這是為了節省記憶體。

父子程序共享:檔案描述符,mmap的對映區。

通常在呼叫fork函式之後,程式會設計乙個if結構。當pid等於0時,說明該程序為子程序,那麼讓它執行某些指令,比如說使用exec庫函式讀取另乙個程式檔案,並在當前的程序空間執行 (這實際上是fork的一大目的: 為某一程式建立程序);而當pid為乙個正整數時,說明為父程序,則執行另外一些指令。由此,就可以在子程序建立之後,讓它執行與父程序不同的功能。fork之後先執行父程序還是子程序是不確定的,取決於核心的排程演算法。

每個程序都屬於乙個程序組,程序組包含多個程序,其中乙個是領導程序,領導程序的pid就是程序組的pid。

執行命令ps -o pid,pgid,ppid,comm | cat

pid  pgid  ppid command

17763

17763

17751 bash

18534

18534

17763 ps

18535

18534

17763

cat

pid為程序自身的id,pgid為程序所在的程序組的id,ppid為程序的父程序id。從上面的結果,我們可以推測出如下關係:

ps和cat都是bash的子程序。程序組的領導程序的pid成為程序組id。領導程序可以先終結。此時程序組依然存在,並持有相同的pgid,直到程序組中最後乙個程序終結。

pid,ppid,pgid資訊都儲存在linux核心區的task_struct結構體中,核心可以通過檢視自己空間中的各個程序的附加資訊就能知道程序的概況,而不用進入到程序自身的空間。

getpgrp函式可獲取當前程序的程序組id。getpgid函式可獲取指定程序的程序組id。setpgid函式可改變程序預設的程序組,可加入另乙個程序組或建立程序組。

Linux 父子程序與fork

每個程序都有乙個非負整數表示的唯一程序id,如交換程序 即排程程序 id為0,init程序id為1,頁守護程序id為2 原型如下 fork函式被呼叫一次,但返回兩次,兩次返回的區別就是子程序返回的是0,父程序返回的新子程序的id 子程序是父程序的副本,獲得了父程序資料空間 堆和棧的副本 父子程序並不...

父子程序終止順序與僵死程序

在linux 父子程序與fork一文中,我們知道子程序是在父程序呼叫fork之後生成的。那麼關於父子程序終止先後順序又會有什麼影響呢?對於父程序已經終止的所有程序,它們的父程序都改變為init程序。我們稱這些程序由init程序收養。其操作過程大致是 在乙個程序終止時,核心逐個檢查所有活動的程序,以判...

python父子程序

面試時被問了一道題,當時腦子短路,想錯了,題目是這樣的,程序a中定義了乙個變數m 通過multiprocessing的process類定義了2個子程序b,c。b執行 print m 然後c執行 print m 這本是一道基礎送分題,根據python官方doc,process有3種產生方式 1.spa...