Linux 基礎總結(二)
Linux 基礎總結(二)
1) SIGHUP本信號在用戶終端連接(正常或非正常)結束時發出,通常是在終端的控制進程結束時, 通知同一session內的各個作業,這時它們與控制終端不再關聯.
2) SIGINT程序終止(interrupt)信號,在用戶鍵入INTR字元(通常是Ctrl-C)時發出
3) SIGQUIT和SIGINT類似,但由QUIT字元(通常是Ctrl-\)來控制.進程在因收到SIGQUIT退出時會產生core文件,在這個意義上類似於一個程序錯誤信號.
4) SIGILL執行了非法指令. 通常是因為可執行文件本身出現錯誤,或者試圖執行數據段. 堆棧溢出時也有可能產生這個信號.
5) SIGTRAP由斷點指令或其它trap指令產生.由debugger使用.
6) SIGABRT程序自己發現錯誤並調用abort時產生.
7) SIGIOT在PDP-11上由iot指令產生,在其它機器上和SIGABRT一樣.
8) SIGBUS非法地址, 包括內存地址對齊(alignment)出錯. eg:訪問一個四個字長的整數, 但其地址不是4的倍數.
9) SIGFPE在發生致命的算術運算錯誤時發出. 不僅包括浮點運算錯誤,還包括溢出及除數為0等其它所有的算術的錯誤.
10) SIGKILL用來立即結束程序的運行. 本信號不能被阻塞,處理和忽略.
11) SIGUSR1留給用戶使用
12) SIGSEGV試圖訪問未分配給自己的內存, 或試圖往沒有寫許可權的內存地址寫數據.
13) SIGUSR2留給用戶使用
14) SIGPIPE Broken pipe
15) SIGALRM時鐘定時信號, 計算的是實際的時間或時鐘時間. alarm函數使用該信號.
16) SIGTERM程序結束(terminate)信號,與SIGKILL不同的是該信號可以被阻塞和處理.通常用來要求程序自己正常退出. shell命令kill預設產生這個信號.
17) SIGCHLD子進程結束時, 父進程會收到這個信號.
18) SIGCONT讓一個停止(stopped)的進程繼續執行.本信號不能被阻塞. 可以用一個handler來讓程序在由stopped狀態變為繼續執行時完成特定的工作.例如, 重新顯示提示符.
19) SIGSTOP停止(stopped)進程的執行.注意它和terminate以及interrupt的區別:該進程還未結束, 只是暫停執行.本信號不能被阻塞, 處理或忽略.
20) SIGTSTP停止進程的運行, 但該信號可以被處理和忽略.用戶鍵入SUSP字元時(通常是Ctrl-Z)發出這個信號
21) SIGTTIN當後台作業要從用戶終端讀數據時, 該作業中的所有進程會收到SIGTTIN信號.預設時這些進程會停止執行.
22) SIGTTOU類似於SIGTTIN, 但在寫終端(或修改終端模式)時收到.
23) SIGURG有緊急數據或out-of-band數據到達socket時產生.
24) SIGXCPU超過CPU時間資源限制.這個限制可以由getrlimit/setrlimit來讀取/改變
25) SIGXFSZ超過文件大小資源限制.
26) SIGVTALRM虛擬時鐘信號. 類似於SIGALRM,但是計算的是該進程佔用的CPU時間.
27) SIGPROF類似於SIGALRM/SIGVTALRM, 但包括該進程用的CPU時間以及系統調用的時間.
28) SIGWINCH窗口大小改變時發出.
29) SIGIO文件描述符準備就緒, 可以開始進行輸入/輸出操作.
30) SIGPWR Power failure
對於2和3信號量好理解,屏蔽ctrl+c和ctrl+\。但是1信號量到底什麼作用呢?
轉自http://blog.csdn.net/cugxueyu/archive/2008/01/16/2046565.aspx
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)
...{
printf("%s : sighup received ",args);
}
int main(int argc,char **argv)
...{
args = argv;
signal(SIGHUP,exithandle);
pause();
return 0;
}
程序中捕捉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,內容為,然後執行該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後父進程馬上退出。
(8)Linux stty
在linux/unix平台上的sqlplus中,如果輸錯了字元,要想刪除,習慣性的按下backspace鍵后,發現非但沒有刪除想要刪掉的字元,還多出了兩個字元^H。當 然,我們可以同時按下ctrl+backspace鍵來刪除,但對於習慣了用backspace來刪除的用戶,這樣很不爽。這可以通過修改tty終端的設置來實現backspace刪除功能。通過使用stty命令,就可以查看或者修改終端的按鍵設置。
例如,設置backspace為刪除鍵:
$ stty erase ^h
如果要改回使用ctrl+backspace為刪除鍵
$ stty erase ^?
如果需要重啟后自動設置終端,可以將上述命令加入到profile中。
可以通過stty -a命令來查看所有的終端設置。下面是在linux下執行的輸出:
$ stty -a
speed 38400 baud; rows 66; columns 132; line = 0;
intr = ^C; quit = ^\; erase = ^H; kill = ^U; eof = ^D; eol = ; eol2 = ; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R;
werase = ^W; lnext = ^V; flush = ^O; min = 1; time = 0;
-parenb -parodd cs8 -hupcl -cstopb cread -clocal -crtscts
-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff -iuclc -ixany -imaxbel
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke
其中:
• eof : 輸入結束
• erase : 向後刪除字元,
• intr : 中斷當前程序
• kill : 刪除整條命令
• quit :退出當前程序
• start : 啟動屏幕輸出
• stop :停止屏幕輸出;
• susp : terminal stop當前程序。
參看引用鏈接:
源文檔
源文檔
源文檔
源文檔
源文檔
源文檔
源文檔
源文檔
《解決方案》
謝謝分享