每乙個程序除了有乙個程序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 每個程序組中可以包含多個程序。程序...