程序組
乙個或多個程序的集合
程序組id: 正整數
兩個函式
getpgid(0)=getpgrp()
eg:顯示子程序與父程序的程序組id
1 #include程序組id = 父程序id,即父程序為組長程序2 #include
3 #include 45
int main() else
if (pid==0)
1718 sleep(3);
19 printf("
the parent process pid is %d.\n
",getpid());
20 printf("
the group id is %d.\n
",getpgrp());
2122
return
0;23 }
組長程序
組長程序標識: 其程序組id==其程序id
組長程序可以建立乙個程序組,建立該程序組中的程序,然後終止
只要程序組中有乙個程序存在,程序組就存在,與組長程序是否終止無關
程序組生存期: 程序組建立到最後乙個程序離開(終止或轉移到另乙個程序組)
乙個程序可以為自己或子程序設定程序組id
setpgid()加入乙個現有的程序組或建立乙個新程序組
eg:父程序改變自身和子程序的組id
1 #include因為stdout被關掉了,所以「never ouput!」不會輸出。2 #include
3 #include 45
int main() else
if (pid==0)
1819 sleep(1);
20 setpgid(pid,pid); //
改變子程序的組id為子程序本身
2122 sleep(5);
23 printf("
the parent process pid is %d.\n
",getpid());
24 printf("
the parent of parent process pid is %d.\n
",getppid());
25 printf("
the group id of parent is %d.\n
",getpgid(0));
26 setpgid(getpid(),getppid()); //
改變父程序的組id為父程序的父程序
會話: 乙個或多個程序組的集合
開始於使用者登入
終止與使用者退出
此期間所有程序都屬於這個會話期
建立新會話:setsid()函式
該呼叫程序是組長程序,則出錯返回
先呼叫fork, 父程序終止,子程序呼叫
該呼叫程序不是組長程序,則建立乙個新會話
•該程序變成新會話首程序(session header)
•該程序成為乙個新程序組的組長程序。
•該程序沒有控制終端,如果之前有,則會被中斷
組長程序不能成為新會話首程序,新會話首程序必定會成為組長程序...
會話id:會話首程序的程序組id
獲取會話id: getsid()函式
在子程序中呼叫setsid()後,子程序成為新會話首程序,且成為乙個組長程序,其程序組id等於會話id
守護程序
linux大多數服務都是通過守護程序實現的,完成許多系統任務
1: init程序, 核心呼叫,負責核心啟動後啟動linux系統
沒有終端限制
讓某個程序不因為使用者、終端或者其他的變化而受到影響,那麼就必須把這個程序變成乙個守護程序
守護程序程式設計步驟
1. 建立子程序,父程序退出
•所有工作在子程序中進行
•形式上脫離了控制終端
2. 在子程序中建立新會話
•setsid()函式
•使子程序完全獨立出來,脫離控制
3. 改變當前目錄為根目錄
•chdir()函式
•防止占用可解除安裝的檔案系統
•也可以換成其它路徑
4. 重設檔案許可權掩碼
•umask()函式
•防止繼承的檔案建立遮蔽字拒絕某些許可權
•增加守護程序靈活性
5. 關閉檔案描述符
•繼承的開啟檔案不會用到,浪費系統資源,無法解除安裝
•getdtablesize()
•返回所在程序的檔案描述符表的項數,即該程序開啟的文件數目
fork且退出父程序
18 exit(0);
1920 setsid(); //
在子程序中建立新會話。
21 chdir("
/"); //
設定工作目錄為根
22 umask(0); //
設定許可權掩碼
23for(i=0;i//
getdtablesize返回子程序檔案描述符表的項數
24 close(i); //
關閉這些不將用到的檔案描述符
2526
while(1)
32//
將buf寫到fd中
33 write(fd,buf,strlen(buf)+1);
34 close(fd);
35 sleep(10);
36 printf("
never output!\n
");37 }
3839
return
0;40 }
檢視/tmp/daemon.log,說明該程式一直在執行
程序 程序組 會話
1.程序組 每個程序屬於乙個程序組,程序組是乙個或多個程序的集合,每個程序有乙個唯一的程序組id。獲取程序組的兩個函式 include pid t getpgrp void pid t getpgrp pid t pid 程序組可以有乙個組長程序,組長程序的標識是,其程序組id等於其程序id。程序組...
linux 程序組 會話期
在linux unix中,有這樣幾個概念 根據posix.1定義 因此當網路斷開或終端視窗關閉後,控制程序收到sighup訊號退出,會導致該會話期內其他程序退出。我們來看乙個例子。開啟兩個ssh終端視窗,在其中乙個執行top命令。root tivf09 root top 在另乙個終端視窗,找到top...
Linux 程序組 作業 會話
我們在利用指令檢視程序資訊的表頭 其中ppid與pid是父程序id與子程序id,而這裡有個pgid是什麼呢?我們在談論執行緒的時候,說過執行緒有乙個執行緒組,而執行緒組id就是這個執行緒主線程的id。也是這個執行緒所組成程序的程序pid。而程序也是有程序組的,這裡的這個pgid就是程序組id,每個程...