歡迎您光臨本站 註冊首頁

Linux 基礎總結(二)

←手機掃碼閱讀     火星人 @ 2014-03-03 , reply:0

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當前程序。



參看引用鏈接:

源文檔

源文檔

源文檔

源文檔

源文檔

源文檔

源文檔

源文檔
《解決方案》

謝謝分享

[火星人 ] Linux 基礎總結(二)已經有321次圍觀

http://coctec.com/docs/service/show-post-981.html