SIGINT
和 SIGHUP
信號含義 到 nohup
和 &
的區別,逐步解釋在計算機科學中,信號
是Unix、類Unix以及其餘POSIX兼容的操做系統中進程間通信的一種有限制的方式。 它是一種異步的通知機制,用來提醒進程一個事件已經發生。當一個信號發送給一個進程,操做系統中斷了進程正常的控制流程,此時,任何非原子操做都將被中斷。若是進程定義了信號的處理函數,那麼它將被執行,不然就執行默認的處理函數。shell
經過kill -l命令得到
SIGINT信號session
程序終止(interrupt)信號, 在用戶鍵入INTR字符(一般是Ctrl-C)時發出,用於通知前臺進程組終止進程。異步
SIGHUP信號函數
本信號在用戶終端鏈接(正常或非正常)結束時發出, 一般是在終端的控制進程結束時, 通知同一session內的各個做業, 這時它們與控制終端再也不關聯。登陸Linux時,系統會分配給登陸用戶一個終端(Session)。在這個終端運行的全部程序,包括前臺進程組和後臺進程組,通常都屬於這個Session。當用戶退出Linux登陸時,前臺進程組和後臺有對終端輸出的進程將會收到SIGHUP信號。這個信號的默認操做爲終止進程,所以前臺進程組和後臺有終端輸出的進程就會停止。此外,對於與終端脫離關係的守護進程,這個信號用於通知它從新讀取配置文件。測試
ctrl + c 產生SIGINT信號,關閉shell窗口產生SIGHUP信號操作系統
測試代碼以下:日誌
用C寫一個腳本,test.out,腳本內容以下:code
#include <stdio.h> void main() { int i=0; while(1){ printf("hello,%d\n", i++); sleep(1); } }
是一個輸出hello與循環輪數的死循環程序,每輸出一行就休眠1秒。進程
./test.out
程序每隔一秒會在終端輸出一個字符串。事件
此時若是鍵入Ctrl+C ,程序會收到一個SIGINT信號,若是不作特殊處理,程序的默認行爲是終止。
關閉 session, 程序會收到一個SIGHUP信號,若是不作特殊處理,程序的默認行爲是終止。
運行程序時在命令後邊加一個&
符號,&
的意思是在後臺運行
執行腳本 ./test.out &
程序每隔一秒會在終端輸出一個字符串。
查看進程號 ps -aux | fgrep test.out
此時鍵入Ctrl + C,發出SIGINT信號,程序會繼續運行。(查看進程號,進程號依舊在,且進程號同樣。)
若是關掉session,程序會收到一個SIGHUP信號, 進程終止。(查看進程號,進程不在。)
nohup: no hang up,不掛起,忽略SIGHUP信號。
執行腳本 nohup ./test.out
發現此時終端沒有像以前那樣,每隔一秒輸出一個字符串
查看進程號 ps -aux | fgrep test.out
,進程存在。
此時鍵入Ctrl + C,發出SIGINT信號,程序終止。(查看進程號,進程不在。)
若是關掉session,程序會收到一個SIGHUP信號, 進程終止。(查看進程號,進程號依舊在,且進程號同樣。)
- 結果會輸出到終端; - 使用 Ctrl + C 發送SIGINT信號,程序免疫; - 關閉session發送SIGHUP信號,程序關閉
- 結果默認會輸出到nohup.out(不會輸出到終端); - 使用Ctrl + C 發送SIGINT信號,程序關閉; - 關閉 session 發送SIGHUP信號,程序免疫
因此,要想進程不受shell中Ctrl C和Shell窗口關閉的影響,就將nohup和&指令一塊兒使用
nohup ./test.out &
同時免疫SIGINT和SIGHUP信號 。
通常不將nohup輸出到 nohup.out 文件,若全部的nohup都輸出到到該文件,則該文件會很大,而是將各自輸出重定向其餘的文件。(如日誌文件)