程式程式設計3 - UNIX高階環境程式設計第9章讀書筆記

ATField發表於2007-03-25

 

9 Process Relationships

1 Process Groups

1.     每個程式屬於一個Process Group,這個process Group從同樣的Terminal獲得Signal

2.     Getpgrp可以獲得process Group ID,也用pid_t結構表示:

#include <unistd.h>

 

pid_t getpgrp(void);

 

返回撥用程式所屬於的Process Group ID

3.     getpgid可以獲得某個程式的Process Group ID

#include <unistd.h>

 

pid_t getpgid(pid_t pid);

 

返回pid制定的程式所屬於的Process Group ID

如果引數pid = 0,則返回撥用程式所屬的ProcessGroupID

4.     每個Group都有一個Leader,這個LeaderProcessID = Process Group ID

5.     一個程式呼叫setpgid來參加或者建立一個process Group

#include <unistd.h>

 

int setpgid(pid_t pid, pid_t pgid);

 

成功返回0,錯誤返回-1

注意如果pid=pgid,則指定程式成為Process Group Leader

如果pid=0,則指定程式為呼叫程式

2 Sessions

1.     Session是一個或者多個Process Group

2.     呼叫setsid函式來建立一個新的session

#include <unistd.h>

 

int setsid(void);

 

成功返回0,錯誤返回-1

 

3.     呼叫setsid函式,如果該程式不是Process Group Leader,則函式會建立一個新的Session

a.     程式成為SessionSession Leader

b.     成為新的Process GroupLeader

c.     程式沒有Controlling Terminal

4.     Single UNIX Specification沒有Session ID,不過我們可以認為一個SessionSession LeaderProcess ID = Session ID

5.     getsid可以獲得Session ID

#include <unistd.h>

 

pid_t getsid(pid_t pid);

 

成功返回Session LeaderProcess ID,錯誤返回-1

同樣的,pid = 0標明是呼叫程式

 

3 Controlling Terminal

SessionProcess Group有下面特性:

1.     Session只能有一個Controlling Terminal

2.     Session LeaderControlling Terminal建立聯絡,稱之為Controlling Process

3.     Session中的Process Group可以被分為一個Foreground process group和多個Background process group

4.     按下Interrupt Key (DELETE or CTRL+C)或者Quit Key (Ctrl+/)signal會傳送給Foreground Process Group中的所有Process

5.     如果network/modem disconnect被檢測到,則Controlling Process會收到一個hang-up signal

6.     大部分時候Controlling Terminal就是我們Login時候的Terminal

4 tcgetpgrp, tcsetpgrp, tcgetsid

1.     下面這些函式可以被用來告訴Kernel那些Process GroupForeground,那些是Background

#include <unistd.h>

 

pid_t tcgetpgrp(int filedes);

 

成功返回Foreground Process GroupID,錯誤返回-1

 

int tcsetpgrp(int filedes, pid_t pgrpid);

 

成功返回0,錯誤返回-1

 

2.     tcgetpgrp返回filedes對應的TerminalForeground process group ID,而tcsetpgrp可以設定foreground process group id

3.     tcgetsid函式可以獲得filedes所對應的Session ID,也就是Session LeaderProcess Group ID

#include <termios.h>

 

pid_t tcgetsid(int filedes);

 

成功返回Session ID,錯誤返回-1

 

作者:      ATField
E-Mail:  
atfield_zhang@hotmail.com
Blog:     
http://blog.csdn.net/atfield

相關文章