程序組 程序 會話的理解2

2021-08-19 19:31:05 字數 3571 閱讀 5838



這篇看懂了。。。

第一種情況:

顯然kill掉父程序,子程序也消亡了!

第二種情況:

我寫了兩個指令碼a.sh 和b.sh, 在a.sh中呼叫b.sh,執行後顯然有兩個程序,而且a.sh為b.sh的父程序,然後我再另外乙個terminal中kill 掉a.sh程序,但b.sh過寄給init程序,而不會終止!

我的例子如下:

[root@qht2 ~]# cat a.sh 

#!/bin/sh

echo "a begin"

./b.sh

echo "a end"

[root@qht2 ~]# cat b.sh 

#!/bin/sh 

echo "b begin"

sleep 180

mkdir abcdef

echo "b end"

[root@qht2 ~]# ./a.sh 

a begin

b begin

在這裡等待(因為b.sh中有sleep 180)

開啟另乙個terminal,檢視程序

[root@qht2 ~]# ps -ef | grep sh

。。。。。。

root 3984 3749 0 11:05 pts/0 00:00:00 /bin/sh ./a.sh

root 3985 3984 0 11:05 pts/0 00:00:00 /bin/sh ./b.sh ##顯然b.sh是a.sh的子程序

root 3990 3838 0 11:05 pts/1 00:00:00 grep sh 

[root@qht2 ~]# kill 3984

[root@qht2 ~]# ps -ef | grep sh

。。。。。。

root 3985 1 0 11:05 pts/0 00:00:00 /bin/sh ./b.sh

root 3992 3838 2 11:06 pts/1 00:00:00 grep sh

第一ternimal中的顯示如下:

[root@qht2 ~]# ./a.sh 

a begin

b begin

terminated

但b.sh還是會執行(因為生成了abcdef目錄)!

這兩種情況的區別是:

父程序退出,子程序被init領養,繼續執行,這才是正常的吧

而前乙個,從名字看明顯是乙個守護程序,id=3803的是會話首程序,也是程序組的組長,kill掉它,會導致sighup傳送給該程序組的每乙個程序(就是所有父程序為3803的那些),預設情況下,sighup會終止程序,所以全沒了.

詳細解釋:

所有程序都是屬於乙個程序組的,而程序組又屬於乙個會話.

普通的程序所屬的會話有控制終端,守護程序所屬會話沒有控制終端.

普通會話的首程序,同時也是建立與控制終端聯絡的程序,在它被kill掉時,會向前臺程序組就(a.sh)傳送sighup訊號.預設情況下,接收到sighup的程序會被終止.此時後台程序組(b.sh)不受影響.

守護程序的會話,因為沒有控制終端,所以就沒有前後臺程序組之分,會話首程序同時也是程序組組長.它被kill掉會向該組每個程序傳送sighup,導致組中程序被中止.

第二個試驗,乙個指令碼呼叫另乙個指令碼的行為,建立了乙個新的程序組,指令碼a.sh是程序組組長,但卻不是所在會話的首程序或控制程序,所以它被kill掉,不影響同組的程序(b.sh),此時init程序會自動領養指令碼b所在程序,並在它執行到結束時**它所占用的資源.

可以用ps -eo pid,ppid,pgrp,session,comm跑一下.

對於第一種情況,就是守護程序,應該會發現那一堆程序的session(會話id)和pgrp(組id)都一樣且是相同的,而且正好等於子程序的ppid,同時也是你kill掉那個程序的pid.這樣可以證實你kill掉的是會話首程序.

對於第二種情況,你會發現,程序a和b的session和pgrp是一樣的,但他們的session和pgrp的值卻並不相同,session的值的**雖無法確定,但pgrp卻應該正好是程序a的pid,這說明了程序a是組長但卻不是會話首程序,所以kill掉a不會導致子程序b被結束.

會話 程序組 程序個人理解

1 程序必定屬於乙個程序組,也只能屬於乙個程序組。乙個程序組中可以包含多個程序。程序組的生命週期從被建立開始,到其內所有程序終止或離開該組。獲取當前程序所在程序組id使用函式getpgrp 建立或加入其他組使用函式setpgid 2 假設條件 pid1程序屬於pgid1程序組 pid2屬於pgid2...

程序 程序組 會話

1.程序組 每個程序屬於乙個程序組,程序組是乙個或多個程序的集合,每個程序有乙個唯一的程序組id。獲取程序組的兩個函式 include pid t getpgrp void pid t getpgrp pid t pid 程序組可以有乙個組長程序,組長程序的標識是,其程序組id等於其程序id。程序組...

Linux 程序組,作業,會話的理解

1.程序組 每個程序除了有乙個程序id之外,還屬於乙個程序組。程序組是乙個或多個程序的集合。通常,它們與同一作業相關聯,可以接收來自同一終端的各種訊號。每個程序組有乙個唯一的程序組id。每個程序組都可以有乙個組長程序。組長程序的標識是,其程序組id等於其程序id。組長程序可以建立乙個程序組,建立該組...