APUE 再讀之程序關係

2021-07-05 03:43:47 字數 1488 閱讀 5848

本章是最為難懂,最為晦澀的一章。主要講解程序組,session, 終端,作業之間關係和概念。

1. 終端登入

終端登入由init自舉fork getty程序,getty 呼叫類似execle("/usr/bin/login","login","-p",username,(char*)0,envp)這樣的語句來完成登入過程。

正確登入後,login 就將當前工作目錄更改為使用者的起始目錄(chdir),呼叫chown改變終端的所有權。呼叫setgid及initgroups設定程序的組id。然後login所得到的所以資訊初始化環境:起始目錄,shell,使用者名稱以及預設系統路徑path,最後login 程序改變為登入使用者的使用者id(setuid)並呼叫該使用者的登入sheel.

execl("/bin/sh","-sh", (char*)0)

2. 程序組概念

#include #include pid_t getpgrp(void);

int setpgid(pid_t pid, pid_t pgid)

乙個改變和設定組id的例子

#include #include #include int main()

else if(pid==0)

else

printf("parent pid=%d,gid=%d\n", getpid(),getpgrp());

}}

3. session 概念

可以通過setsid來脫離原有session 建立新的session. 組長程序不能呼叫setsid,否則出錯。呼叫後新session脫離原有控制終端。

setsid的一般會在建立精靈程序時被呼叫。

4. session ,控制終端和程序組關係

5. 孤兒程序組

父程序終止的程序組稱為孤兒程序組。父程序終止後,子程序由init程序領養。父程序結束後,kernel 會向子程序傳送sighup 和sigcont訊號。

下面demo,如果子程序不註冊接收sighup的signal 函式,那子程序將會被終止。

子程序試圖讀終端會失敗。

#include #include #include #include #include #include #include static void pr_ids(char* name)

static void sig_hup(int signo)

int main()

else if (pid>0) //parent

else

*/kill(getpid(),sigtstp);

pr_ids("child");

char c;

if(read(0,&c,1)!=1)

printf("read error, errno =%d, reason=%s\n", errno, strerror(errno));

exit(0);

}}

APUE 程序關係

unix程序關係主要有三種 父程序和子程序 程序組 程序會話。1 程序組 每個程序除了有乙個程序id之外,還屬於乙個程序組。程序組是乙個或多個程序的集合。通常他們與同一作業相關聯,可接受來自同一終端的各種訊號。函式getpgrp返 用程序的程序組id。includepid t getpgrp voi...

APUE 再讀之 標準IO庫

本章介紹標準io庫 1.file物件 標準io庫一切函式基於file物件。file物件包含了管理該流的所有資訊 檔案描述符,指向流快取的指標,快取的長度,快取的位元組數以及出錯標識等 2.標準輸入,標準輸出和標準出錯。對應非標準io stdin fileno,stdout fileno,stderr...

APUE讀書筆記 14 程序關係 下

一 會話 會話是乙個或者多個程序組的集合,如下圖中乙個會話有三個程序組 會話中的程序組通常是由shell中的管道 進行連線的,比如上圖的安排可能是有如下命令形成的 p1 p2 p3 p4 p5,程序呼叫setsid函式可以建立乙個新會話。如果呼叫這個函式的程序不是乙個程序組的組長,那麼將會發生以下三...