Linux 程序間關係和守護程序

2021-09-05 10:57:07 字數 2914 閱讀 5593

程序組是乙個或多個程序的集合。通常與乙個作業相關聯,可以接收來自同一終端的各種訊號。我們知道,每個程序都有乙個程序id存放在task_struct中,程序組也有程序組id,是唯一的。乙個執行緒組擁有主線程,主線程id就是執行緒組id,類似地,程序組也有乙個組長程序,組長程序的id就是程序組id。組長程序可以建立乙個程序組,建立組中的程序,然後終止。只要某乙個程序存在,程序組就存在,不會隨著組長程序的退出而消失,只有組中所有程序都退出時,程序組才會退出。

我們可以看到,目前有三個程序,&的作用的將程序組放到後台執行。程序id分別是 2826 2827 2828組長id pgid=2826。可以自己測試一下,使用kill命令殺掉組長程序之後,程序組還在。

ps 命令: -a 列出所有使用者的程序。 -x 不僅列出有終端控制的程序,也列出無終端控制的程序。 -j 表示列出與作業相關的資訊。

乙個作業可以包含乙個或多個程序,尤其是使用了管道和重定向之後,列如上面的列子,sleep 100|sleep 200|sleep 300 這條命令就同時啟動了三個程序,屬於乙個作業。

shell分前後臺執行的不是程序,而是作業和程序組。作業和程序組的區別:作業中某個程序建立的子程序不屬於作業。

shell可以執行乙個前台作業和任意個後台作業。當我們建立乙個作業時,shell會到後台,無法執行shell(不能執行新輸入的命令)。作業執行結束後,shell將提到前台,此時可以輸入命令執行shell。我們來看一段**。

#include #include int main(int argc, char const *argv)

else if(id == 0)

}else

}return 0;

}

我們可以發現程式執行之後,我們無法通過shell執行其他命令。fork 建立了乙個子程序,父程序5s後會退出,但是子程序還存在。因為子程序不屬於這個作業,所以父程序退出後,作業也就退出了。這個時候,shell已經提到前台,可以執行新的命令。但是子程序還存在,程序組也存在(只是組長程序,即父程序退出了),此時這個子程序被放到後台。

會話是乙個或多個程序組的集合。乙個控制終端下可以有乙個會話。建立控制終端與會話連線的程序叫做會話首程序(控制程序),乙個會話可以有乙個前台程序組和多個後台程序組。

當我們新開啟乙個終端時:

我們可以看到有乙個 sid 這個就是會話id 可以看到這個id是2811,那麼這個2811是誰?

我們可以看到,這就是我們的bash,就是會話首程序,也就是這三個程序的父程序。

第一步:我們首先建立兩個後台作業1和2,並用jobs命令檢視作業。

第二步:fg 命令可以將某個後台作業提到前台執行,如果該作業正在後台執行,則直接提到前台執行,如果改作業在後態是停止狀態,則向該作業傳送訊號sigcont使它繼續執行。引數 1 表示操作的作業是第乙個。

第三步:ctrl + z是向所有前台程序傳送訊號sigtstp,使程序停止。然後再用jobs命令檢視作業。

第四步:bg的作用是將某個停止的作業在後台繼續執行,會給所有程序傳送訊號sigcont。然後jobs檢視作業。

第五步:將作業1提到前台執行。

第六步:ctrl + c 終止整個作業。 而不是單個程序。然後用jobs檢視只剩下乙個後台作業了。

守護程序是執行在後台的一種特殊程序。它獨⽴於控制終端並且周期性地執⾏某種任務或等待處理某些發⽣的事件。守護程序是⼀種很有⽤的程序。linux的⼤多數伺服器就是⽤守護程序實現的。⽐如,ftp伺服器,ssh伺服器,web伺服器httpd等。

linux系統啟動時會啟動很多系統服務程序,這些系統服務程序沒有控制終端,不能直接和⽤戶互動。其它程序都是在⽤戶登入或運⾏程式時建立,在運⾏結束或⽤戶登出時終⽌,但系統服務程序(守護程序)不受⽤戶登入登出的影響,它們⼀直在運⾏著。這種程序有⼀個名稱叫守護程序(daemon)。

我們可以通過命令 ps -axj檢視。

我們可以看到,tpgid為-1的都是守護程序。

在command⼀列⽤括起來的名字表⽰核心執行緒,這些執行緒在核心⾥建立,沒有⽤戶空間**,因此沒有程式⽂件名和命令⾏, 通常採⽤以k開頭的名字,表⽰kernel。

建立守護程序:

建立守護程序需要用setsid來建立乙個新的會話。該程序成為會話首程序。

#include

pid_t setsid(void);

該函式調⽤成功時返回新建立的會話的id(其實也就是當前程序的id),出錯返回-1。

注意,調⽤這個函式之前,當前程序不允許是程序組的組長程序,否則該函式返回-1。要保證當前程序不是程序組的組長程序也很容易,只要先fork再調⽤setsid就⾏了。fork建立的⼦程序和⽗程序在同⼀個程序組中,程序組的組長程序必然是該組的第⼀個程序,所以⼦程序不可能是該組的第⼀個程序,在⼦程序中調⽤setsid就不會有問題了。

呼叫該函式成功後:

建立⼀個新的會話,當前程序成為會話首程序,當前程序的id就是session的id。

建立⼀個新的程序組,當前程序成為程序組的組長程序,當前程序的id就是程序組的id。

如果當前程序原本有⼀個控制終端,則它失去這個控制終端,成為⼀個沒有控制終端的程序。

Linux 程序間關係 守護程序

ps axj head n 1乙個或多個程序的集合 只要在某個程序組中 個程序存在,則該程序組就存在,這與其組 程序是否終 關。個前台作業可以由多個程序組成 乙個後台也可以由多個程序組成 作業與程序組的區別 a.out sid 會話 session 是 個或多個程序組的集合。建 與控制終端連線的會話...

程序間關係與守護程序

程序組 乙個程序除了有乙個程序id之外,他還屬於乙個程序組。程序組是乙個或者多個程序的集合。通常他們與同乙個作業相關聯,可以接受來自同乙個終端的各種訊號。每個程序組有乙個唯一的程序組id。每個程序都有乙個組長程序,其程序組的id等於其自己的程序id。組長程序可以建立乙個程序組,建立各組中程序,然後終...

程序間關係及守護程序

程序組 乙個或者多個程序的集合。程序有自己的程序id,同時他還屬於乙個程序組。既然有程序組那麼肯定就有組長程序 組長程序的id等於該程序組id 這個組中只要還有乙個程序還在,程序組就在!與組長在不在沒關係。作業控制 乙個shell可以執行乙個前台作業和任意個後台作業。前台和後台都可以由多個程序 組成...