在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 教程/ Linux/ 信號和 Traps
通信工具
信號和 Traps
文件管理
vi 編輯器使用向導
替代
變量
環(huán)境
進程管理
實用工具
引用機制
Manpage 幫助
文件系統(tǒng)基礎知識
系統(tǒng)日志
循環(huán)
正則表達式和 SED
目錄
函數
管道和過濾器
特殊變量
輸入/輸出重定向
系統(tǒng)性能
用戶管理
循環(huán)控制
決策
什么是 UNIX ?
數組
什么是 Shell 腳本
基本操作符
文件權限

信號和 Traps

信號是發(fā)送給程序的軟件中斷,表明已發(fā)生的重要事件。這些事件的范圍可以是從用戶請求到非法內存訪問錯誤。這些信號,如中斷信號,表明用戶要求程序做一些非一般流程控制下的事情。

以下是一些你可能會遇到的并且需要在程序中使用的常見信號:

信號名 信號值 描述
SIGHUP 1 控制終端意外終止或者是控制進程結束時發(fā)出
SIGINT 2 用戶發(fā)送一個中斷信號時發(fā)出(Ctrl+C)。
SIGQUIT 3 用戶發(fā)送一個退出信號時發(fā)出(Ctrl+D)。
SIGFPE 8 當非法的數學操作執(zhí)行時發(fā)出。
SIGKILL 9 一個進程獲取到此信號,它必須立即退出,并且不能進行任何清除操作。
SIGALRM 14 時鐘信號(用于定時器)
SIGTERM 15 軟件終止信號(kill 命令缺省產生此信號)。

信號列表

有一個簡單的方法可以列出你的系統(tǒng)所支持的所有信號。僅僅用命令 kill -l 就可以顯示系統(tǒng)所有支持的信號:

    $ kill -l
     1) SIGHUP       2) SIGINT       3) SIGQUIT      4) SIGILL
     5) SIGTRAP      6) SIGABRT      7) SIGBUS       8) SIGFPE
     9) SIGKILL     10) SIGUSR1     11) SIGSEGV     12) SIGUSR2
    13) SIGPIPE     14) SIGALRM     15) SIGTERM     16) SIGSTKFLT
    17) SIGCHLD     18) SIGCONT     19) SIGSTOP     20) SIGTSTP
    21) SIGTTIN     22) SIGTTOU     23) SIGURG      24) SIGXCPU
    25) SIGXFSZ     26) SIGVTALRM   27) SIGPROF     28) SIGWINCH
    29) SIGIO       30) SIGPWR      31) SIGSYS      34) SIGRTMIN
    35) SIGRTMIN+1  36) SIGRTMIN+2  37) SIGRTMIN+3  38) SIGRTMIN+4
    39) SIGRTMIN+5  40) SIGRTMIN+6  41) SIGRTMIN+7  42) SIGRTMIN+8
    43) SIGRTMIN+9  44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12
    47) SIGRTMIN+13 48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14
    51) SIGRTMAX-13 52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10
    55) SIGRTMAX-9  56) SIGRTMAX-8  57) SIGRTMAX-7  58) SIGRTMAX-6
    59) SIGRTMAX-5  60) SIGRTMAX-4  61) SIGRTMAX-3  62) SIGRTMAX-2
    63) SIGRTMAX-1  64) SIGRTMAX

Solaris, HP-UX 和 Linux 之間實際的信號列表會有所不同。

默認動作

每一個信號都有一個與之相隨的默認動作。一個信號的默認動作是當腳本或程序接收到一個信號時,它的執(zhí)行表現。

這些可能的默認動作是:

  • 終止進程。

  • 忽略信號。

  • 內核映像轉儲。當收到信號時,此動作將創(chuàng)建一個稱為 core 的文件,其包含進程的內存映像。

  • 停止進程。

  • 繼續(xù)停止的進程。

發(fā)送信號

有幾種向程序或者腳本傳遞信號的方法。其中用戶最常見的是在正在運行的腳本的時候,按下 Ctrl+C 或者 INTERRUPT 鍵。

當你按下 Ctrl+C 鍵,信號 SIGINT 被發(fā)送到腳本中,根據之前定義的默認動作,腳本將會被終止。

另外一種常見的傳送信號的方法是使用 kill 命令,其語法如下所示:

    $ kill -signal pid

這里的 signal 要么是信號值,要么是信號名稱。 pid 是信號要發(fā)送到的進程的 ID。 例如:

    $ kill -1 1001

發(fā)送 HUP 信號(即意外終止信號)到運行進程 ID 為 1001 的程序。 用下面的命令來發(fā)送一個 kill 信號到同樣的進程:

    $ kill -9 1001

這條命令會殺死運行進程 ID 為 1001 的程序。

捕獲信號

當一個 Shell 程序正在執(zhí)行的過程中,你在終端按下了 Ctrl+C 或 Break 鍵,通常情況下,程序會立即終止,并且你的命令提示返回。但這可能并不總是你所期望的。例如,這可能會留下一堆未清理的臨時文件。

捕獲這些信號是很容易的,捕獲命令(trap)的語法如下:

    $ trap commands signals

這里的 commands 可以是任何有效的 UNIX 命令,甚至可以是一個用戶定義的函數。

signals 可以是一個你想捕獲的任何數量信號的列表。

在 Shell 腳本中,trap 有三種常見的用途:

  1. 清除臨時文件
  2. 忽略信號

清除臨時文件

作為 trap 命令的一個例子,下面的命令展示了,如果有人試圖從終端中止程序時,你如何先刪除一些文件,然后退出:

    $ trap "rm -f $WORKDIR/work1$$ $WORKDIR/dataout$$; exit" 2

如果程序收到了信號值為 2 的信號,trap 命令將會被執(zhí)行。從 Shell 程序上執(zhí)行 trap 的這一點開始,work1$$ 和 dataout$$ 這兩個文件會自動被刪除。

所以如果用戶中斷程序的運行,這個 trap 將會被執(zhí)行,你可以確保這兩個文件將被清理掉。rm 后面的這個 exit 命令,它的存在是必要的。如果沒有它,程序會在它中斷點(也就是信號接收的時刻)繼續(xù)執(zhí)行。

信號值 1 是由掛斷產生的:要么是有人故意掛斷終端或者是終端被意外斷開。

在這種情況下,把信號值 1 增加到信號列表中,你可以通過這樣修改上面的 trap 命令,從而刪除那兩個指定的文件:

    $ trap "rm $WORKDIR/work1$$ $WORKDIR/dataout$$; exit" 1 2

現在,如果終端被掛起或者是 Ctrl+C 被按下,這些文件將被刪除。

指定的 trap 命令如果包含多個命令,那么它們必須括在引號中。還要注意,當 trap 命令執(zhí)行時,shell 會掃描一遍命令行,當接收到信號列表的其中一個信號時,也會再執(zhí)行一次掃描。

所以在上面的例子中,當 trap 命令執(zhí)行后,WORKDIR 和 $$ 的值將會被替換。如果你想要這種替換僅僅發(fā)生在信號值 1 或者 2 接收到的時候,你可以用單引號把多個命令引起來:

    $ trap 'rm $WORKDIR/work1$$ $WORKDIR/dataout$$; exit' 1 2

忽略信號

如果 trap 命令的 command 字段是空的,那么當接收到指定的信號后,信號將被忽略。例如下面的一個命令:

    $ trap '' 2

指定的中斷信號將被忽略。當執(zhí)行某些可能不想被打斷的操作時,你可能會想忽略掉些特定的信號。按如下所示,你可以指定要忽略的多個信號:

    $ trap '' 1 2 3 15

注意,如果要一個信號被忽略掉,那么第一個參數必須是指定的空,它不等同于如下的命令,下面的命令有自己單獨的意義:

    $ trap  2

如果你忽略了一個信號,那么你所有的子 Shell 也會忽略此信號。然而,如果你指定了接收一個信號所采取的動作,那么所有的子 shell 接收到此信號后會采取相同動作。

重置 Traps

當你改變了信號接收后的默認動作,你可以通過一個簡單的省略第一個參數的 trap 命令將默認動作重置回來。

那么命令

    $ trap 1 2

將信號 1 和 2 接收后采取的動作重置為其原有的默認動作。