進程組和會話

來源:互聯網
上載者:User

標籤: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,然後使其父進程終止,而子進程則繼續。

進程組和會話

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.