本章是最為難懂,最為晦澀的一章。主要講解程序組,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函式可以建立乙個新會話。如果呼叫這個函式的程序不是乙個程序組的組長,那麼將會發生以下三...