SIGHUP訊號與控制終端

2021-09-01 22:19:00 字數 2031 閱讀 9287

[size=large] sighup訊號與控制終端

unix中程序組織結構為 session (會話)包含乙個前台程序組及乙個或多個後台程序組,乙個程序組包含多個程序。乙個session可能會有乙個session首程序,而乙個session首程序可能會有乙個控制終端。乙個程序組可能會有乙個程序組首程序。程序組首程序的程序id與該程序組id相等。這兒是可能會有,在一定情況之下是沒有的。與終端互動的程序是前台程序,否則便是後台程序。

sighup會在以下3種情況下被傳送給相應的程序:

1、終端關閉時,該訊號被傳送到session首程序以及作為job提交的程序(即用 & 符號提交的程序)

2、session首程序退出時,該訊號被傳送到該session中的前台程序組中的每乙個程序

3、若父程序退出導致程序組成為孤兒程序組,且該程序組中有程序處於停止狀態(收到sigstop或sigtstp訊號),該訊號會被傳送到該程序組中的每乙個程序。

系統對sighup訊號的預設處理是終止收到該訊號的程序。所以若程式中沒有捕捉該訊號,當收到該訊號時,程序就會退出。

下面觀察幾種因終端關閉導致程序退出的情況,在這兒程序退出是因為收到了sighup訊號。login shell是session首程序。

首先寫乙個測試程式,**如下:

#include

#include

char **args;

void exithandle(int sig)

int main(int argc,char **argv)

程式中捕捉sighup訊號後列印一條資訊,pause()使程式暫停。

編譯後的執行檔案為sigtest。

1、命 令:sigtest front > tt.txt

操 作:關閉終端

結 果:tt.txt檔案的內容為front : sighup received

原 因: sigtest是前台程序,終端關閉後,根據上面提到的第1種情況,login shell作為session首程序,會收到sighup訊號然後退出。根據第2種情況,sigtest作為前台程序,會收到login shell發出的sighup訊號。

2、命 令:sigtest back > tt.txt &

操 作:關閉終端

結 果:tt.txt檔案的內容為 back : sighup received

原 因: sigtest是提交的job,根據上面提到的第1種情況,sigtest會收到sighup訊號。

3、命 令:寫乙個shell,內容為[sigtest &],然後執行該shell

操 作:關閉終端

結 果:ps -ef | grep sigtest 會看到該程序還在,tt檔案為空

原 因: 執行該shell時,sigtest作為job提交,然後該shell退出,致使sigtest變成了孤兒程序,不再是當前session的job了,因此sigtest即不是session首程序也不是job,不會收到sighup。同時孤兒程序屬於後台程序,因此login shell退出後不會傳送sighup給sigtest,因為它只將該訊號傳送給前台程序。第3條說過若程序組變成孤兒程序組的時候,若有程序處於停止狀態,也會收到sighup訊號,但sigtest沒有處於停止狀態,所以不會收到sighup訊號。

4、命 令:nohup sigtest > tt

操 作:關閉終端

結 果:tt檔案為空

原 因: nohup可以防止程序收到sighup訊號

至此,我們就清楚了何種情況下終端關閉後程序會退出,何種情況下不會退出。

要想終端關閉後程序不退出有以下幾種方法,均為通過shell的方式:

1、編寫shell,內容如下

trap "" sighup #該句的作用是遮蔽sighup訊號,trap可以遮蔽很多訊號

sigtest

2、nohup sigtest 可以直接在命令列執行,

若想做完該操作後繼續別的操作,可以 nohup sigtest &

3、編寫shell,內容如下

sigtest &

其實任何將程序變為孤兒程序的方式都可以,包括fork後父程序馬上退出。

[/size]

SIGHUP訊號與控制終端

sighup 訊號與控制終端 unix中程序組織結構為session 會話 包含乙個前台程序組及乙個或多個後台程序組,乙個程序組包含多個程序。乙個session可能會有乙個session首程序,而乙個session首程序可能會有乙個控制終端。乙個程序組可能會有乙個程序組首程序。程序組首程序的程序id...

nohup 命令與 SIGHUP 訊號

sighup訊號 sighup 訊號在使用者終端連線 正常或非正常 結束時發出,通常是在終端的控制程序結束時,通知同一session內的各個作業,這時它們與控制終端不再關聯.系統對sighup訊號的預設處理是終止收到該訊號的程序。所以若程式中沒有捕捉該訊號,當收到該訊號時,程序就會退出。sighup...

nginx訊號控制

t erm,int quick shutdown quit graceful shutdown 優雅的關閉程序 即等請求結束後再關閉 hupconfiguration reload start the new worker processes with a new configuration gra...