標籤:linux unix 進程組 會話 session
進程組
進程組是指一個或多個進程的集合。通常與一個作業相關聯,可以接收來自同一終端的訊號。每個進程組有一個唯一的進程組ID,它類似於進程ID,是一個正整數(其實就是組長進程的進程ID)。可以通過函數獲得
#include<unistd.h>
pid_t getpgrp(void);
進程組都有一個組長,組長進程的標識是其進程組ID等於進程ID。
組長可以建立一個組長進程組,建立該進程組的進程,然後終止。進程存在於組長存在沒必要關係,只要進程組有一個進程存在,則進程組就存在。進程組生命週期為組長建立到最後一個進程離開為止。進程組中最後一個進程可以終止,或者轉移到另一個進程組中。
可以通過下面函數加入一個進程組或建立一個進程組:
#include<unistd.h>
int setpgid(pid_t pid, pit_t pgid);
一個進程只能為它自己或自己的子進程設定進程組ID,在它的子進程調用了exec函數後,它就不能再改變該子進程的進程組ID了。
在大多數作業控制的shell中,在fork之後調用setpgid函數,使父進程設定其子進程的進程組ID,並且使子進程設定其自己的進程組ID。如果不這樣做,那麼fork之後,由於父、子進程運行先後次序的不確定,會造成在一段時間內(父、子進程只運行了其中一個)子進程組員身份的不確定(取決於哪個進程先執行),這就產生了競爭條件。
會話(session)
會話是一個或多個進程組的集合。shell的管道線將幾個進程編成一組。
proc1 | proc2 &
proc3 | proc4 | proc5
編成的會話如:
進程調用setsid函數建立一個新會話
#include<unistd.h>
pid_t setsid(void);
如果調用此函數的進程不是一個進程組的組長,則此函數會建立一個新會話,結果將發生下面3件事:
1、該進程變成新會話首進程。此時,該進程是新會話的唯一的進程。
2、該進程成為一個新進場組的組長進程。新進程組的ID是該調用進程的進程ID。
3、該進程沒有控制終端。如果有,在調用後,這種聯絡也會被中斷。
如果該進程是一個進程組的組長進程,則此函數返回出錯。為了保證不會發生這種情況,通常先調用fork,然後使其父進程終止,而子進程則繼續。
進程組和會話