Linux 程序組 會話 守護程序

2022-03-31 02:04:21 字數 4547 閱讀 2520

程序組

乙個或多個程序的集合

程序組id: 正整數

兩個函式

getpgid(0)=getpgrp()

eg:顯示子程序與父程序的程序組id

1 #include 

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==其程序id

組長程序可以建立乙個程序組,建立該程序組中的程序,然後終止

只要程序組中有乙個程序存在,程序組就存在,與組長程序是否終止無關

程序組生存期: 程序組建立到最後乙個程序離開(終止或轉移到另乙個程序組)

乙個程序可以為自己或子程序設定程序組id

setpgid()加入乙個現有的程序組或建立乙個新程序組

eg:父程序改變自身和子程序的組id

1 #include 

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 }

因為stdout被關掉了,所以「never ouput!」不會輸出。

檢視/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,每個程...