Linux中的程序關係詳解

2021-07-07 01:23:37 字數 3253 閱讀 5583

​   每乙個程序除了有乙個程序id之外,還屬於乙個程序組,程序組通常是乙個或多個程序的集合。這些程序通常是與乙個作業相關的。例如:ps axu|grep bash|wc -l 這是三個程序,他們直接通過管道傳遞資料,為了是完成乙個作業,對於這個整體來說是乙個程序組,其中ps程序是程序組的組長程序。程序組也是由乙個id來標識程序組的,通過使用pgid來標識,然而這個pgid==程序組組長程序的pid的使用下面的這個命令來驗證這一事實:

[root@localhost common]# ps -o pid,ppid,pgid,sid,comm|more

pi***id

pgid

sidcommand

2445

2441

2445

2445 bash

3882

2445

3882

2445 ps

3883

2445

3882

2445 more

ps 是其中的第乙個程序,也是這個程序組的組長程序,那麼其

pid==pgid==2882 more和ps是同乙個程序組的,因為其pgid相同

下面這兩個方法是用來設定和獲取程序組的方法

#include 

int setpgid(pid_t pid, pid_t pgid);

如果pid等於pgid,那麼pid就成為了其所屬的程序組的組長程序,

如果pid等於0,則標識把當前程序設定為pgid的組長程序

如果pgid等於0,則使用pid作為目標pgid

pid_t getpgid(pid_t pid); //這個方法的使用很簡單,這裡不做介紹

下面是乙個測試的例子,在這個例子顯示出乙個只有單個程序的程序組

#include 

#include

int main()

測試結果如下: a.out屬於4082這個程序組的,並且是組長程序

[root@localhost ~]# ps -o pid,ppid,pgid,sid,comm a

pid ppid pgid sid command

1698

8151698

1698 bash

2445

2441

2445

2445 bash

4082

2445

4082

2445 a.out

4087

4083

4087

4087 bash

4206

4087

4206

4087 ps

​   可以看出正常情況下,直接執行的程序通常是乙個新程序組的組長程序,與這個程序有通訊的,或者是這個程序派生的都屬於這個程序組.

​   會話就是一些有關聯的程序組的集合而已.概念上來說其實不是很難理解,下面是乙個展示會話其含義的例子:

[root@localhost ~]#  ps -o pid,ppid,pgid,sid,comm|more

pi***id

pgid

sidcommand

4087

4083

4087

4087 bash

4521

4087

4521

4087 ps

4522

4087

4521

4087 more

​   再次使用這個例子,ps 和more程序是乙個程序組,bash程序屬於另外乙個程序組,bash執行了ps和more程序,所以這兩個程序組存在關聯,屬於乙個會話。其中sid代表這個會話的id,從上面的結果可以看書,ps more bash是兩個程序組的,但是都是乙個會話的。會話id,為首領程序組的組長程序的pid,

相信通過上面的這個例子,你應該對會話有了乙個新的概念了吧.

用於設定和獲取session id的api

#include

pid_t getsid(pid_t pid);

//獲取指定程序的sid

pid_t setsid(void);

1.不能由程序組的組長程序呼叫,否則會產生錯誤

2.非程序組的組長程序呼叫將會建立會話並且會產生下面的效果:

1.呼叫程序成為會話的首領,此時該程序是新會話的唯一成員

2.新建乙個程序組,其pgid為其pid,該程序成為該組的組長程序

3.呼叫程序講脫離終端(守護程序中常用)

乙個錯誤使用setsid的例子

#include 

#include

int main()

setsid error: operation not permitted

[root@localhost ~]# ps -o pid,ppid,pgid,sid,comm a

pid ppid pgid sid command

1698

8151698

1698 bash

2445

2441

2445

2445 bash

4087

4083

4087

4087 bash

4960

2445

4960

2445 a.out

4961

4087

4961

4087 ps

​   上面的例子會執行失敗,其執行失敗的原因在於執行這個程式後,這個程式是乙個程序組的組長程序,組長程序是無法呼叫setsid的.下面的例子是乙個正確使用setsid的例子:

#include 

#include

int main()

} pid ppid pgid sid command

5070

2445

5070

2445 a.out

5071

5070

5071

5071 a.out

​   上面的例子中通過在子程序中呼叫setsid成功建立了乙個新的會話,和新的程序組,並且成為了新程序組的組長程序以及會話的領導程序組.子程序之所以可以成功建立會話是因為父程序是程序組的組長程序,子程序只是屬於這個程序組中的乙個程序而已,除此之外什麼也不是,所以這個子程序具備setsid的使用條件.

Linux程序關係

linux的程序相互之間有一定的關係。比如說,在linux程序基礎中,我們看到,每個程序都有父程序,而所有的程序以init程序為根,形成乙個樹狀結構。我們在這裡講解程序組和會話,以便以更加豐富的方式了管理程序。每個程序都會屬於乙個程序組 process group 每個程序組中可以包含多個程序。程序...

Linux程序關係

linux的程序相互之間有一定的關係。比如說,在linux程序基礎中,我們看到,每個程序都有父程序,而所有的程序以init程序為根,形成乙個樹狀結構。我們在這裡講解程序組和會話,以便以更加豐富的方式了管理程序。每個程序都會屬於乙個程序組 process group 每個程序組中可以包含多個程序。程序...

Linux程序關係

linux的程序相互之間有一定的關係。比如說,在linux程序基礎中,我們看到,每個程序都有父程序,而所有的程序以init程序為根,形成乙個樹狀結構。我們在這裡講解程序組和會話,以便以更加豐富的方式了管理程序。每個程序都會屬於乙個程序組 process group 每個程序組中可以包含多個程序。程序...