防偽碼:李白乘舟將欲行,忽聞岸上踏歌聲。
9.1 linux 訊號型別
訊號(signal):訊號是在軟體層次上對中斷機制的一種模擬,通過給乙個程序傳送訊號,執行響
應的處理函式。
程序可以通過三種方式來響應乙個訊號:
1)忽略訊號,即對訊號不做任何處理,其中有兩個訊號不能忽略:sigkill 及 sigstop。
2)捕捉訊號。
3)執行預設操作,linux 對每種訊號都規定了預設操作。
linux 究竟採用上述三種方式的哪乙個來響應訊號呢?取決於傳遞給響應 api 函式的引數。
linux 支援的訊號有:
編號 訊號名稱 預設動作 描述
1 sighup 終止 終止程序,掛起
2 sigint 終止 鍵盤輸入中斷命令,一般是 ctrl+c
3 sigquit coredump 鍵盤輸入退出命令,一般是 ctrl+\
4 sigill coredump 非法指令
5 sigtrap coredump trap 指令發出,一般除錯用
6 sigabrt coredump abort(3)發出的終止訊號
7 sigbus coredump 非法位址
8 sigfpe coredump 浮點數異常
9 sigkill 終止 立即停止程序,不能捕獲,不能忽略
10 sigusr1 終止
使用者自定義訊號 1,像 nginx 就支援 usr1 訊號,用於過載配
置,重新開啟日誌
11 sigsegv coredump 無效記憶體引用
12 sigusr2 終止 使用者自定義訊號 2
13 sigpipe 終止 管道不能訪問
14 sigalrm 終止 時鐘訊號,alrm(2)發出的終止訊號
15 sigterm 終止
終止訊號,程序會先關閉正在執行的任務或開啟的檔案再終
止,有時間程序在有執行的任務而忽略此訊號。不能捕捉
16 sigstkflt 終止 處理器棧錯誤
17 sigchld 可忽略 子程序結束時,父程序收到的訊號
18 sigcont 可忽略 讓終止的程序繼續執行
19 sigstop 停止 停止程序,不能忽略,不能捕獲
20 sigstp 停止 停止程序,一般是 ctrl+z
21 sigttin 停止 後台程序從終端讀資料
22 sigttou 停止 後台程序從終端寫資料
23 sigurg 可忽略 緊急陣列是否到達 socket
24 sigxcpu coredump 超出 cpu 占用資源限制
25 sigxfsz coredump 超出檔案大小資源限制
26 sigvtalrm 終止
虛擬時鐘訊號,類似於 sigalrm,但計算的是程序占用的時
間 27 sigprof 終止 類似與 sigalrm,但計算的是程序占用 cpu 的時間
28 sigwinch 可忽略 視窗大小改變發出的訊號
29 sigio 終止 檔案描述符準備就緒,可以輸入/輸出操作了
30 sigpwr 終止 電源失敗
31 sigsys coredump 非法系統呼叫
coredump(核心轉儲):當程式執行過程中異常退出時,核心把當前程式在記憶體狀況儲存在乙個
core 檔案中,以便除錯。
linux 支援兩種訊號:
一種是標準訊號,編號 1-31,稱為非可靠訊號(非實時),不支援佇列,訊號可能會丟失,比如發
送多次相同的訊號,程序只能收到一次,如果第乙個訊號沒有處理完,第二個訊號將會丟棄。
另一種是擴充套件訊號,編號 32-64,稱為非可靠訊號(實時),支援佇列,發多少次程序就可以收到
多少次。
訊號型別比較多,我們只要了解下,記住幾個常用訊號就行了,紅色標記的我覺得需要記下。
傳送訊號一般有兩種情況:
一種是核心檢測到系統事件,比如鍵盤輸入 ctrl+c 會傳送 sigint 訊號。
另一種是通過系統呼叫 kill 命令來向乙個程序傳送訊號。
l 9.2 kill 命令
kill 命令傳送訊號給程序。
命令格式:kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... or kill -l
[sigspec]
-s # 訊號名稱
-n # 訊號編號
-l # 列印編號 1-31 訊號名稱
示例:給乙個程序傳送終止訊號:
kill -s sigterm pid
或 kill -n 15 pid
或 kill -15 pid
或 kill -trem pid
p 9.3 trap 命令
trap 命令定義 shell 在處理程式執行時接受訊號,來做相應的處理。
命令格式:trap [-lp] [[arg] signal_spec ...]
-l # 列印編號 1-64 編號訊號名稱
arg # 捕獲訊號後執行的命令或者函式
signal_spec # 訊號名或編號
一般捕捉訊號後,做以下幾個行動:
1)清除臨時檔案
2)忽略該訊號
3)詢問使用者是否終止指令碼執行
示例 1:按 ctrl+c 不退出迴圈
#!/bin/bash
trap "" 2 # 不指定 arg 就不做任何操作,後面也可以寫多個訊號,以空格分隔
for i in ; do
echo $i
sleep 1
done
# bash a.sh
1 23 ^c4
5 6^c7
8 910 示例 2:迴圈列印數字,按 ctrl+c 退出,並列印退出提示
#!/bin/bash
trap "echo 'exit...';exit" 2
for i in ; do
echo $i
sleep 1
done
# bash test.sh
1 23 ^cexit...
示例 3:讓使用者選擇是否終止迴圈
#!/bin/bash
trap "func" 2
func()
for i in ; do
echo $i
sleep 1
done
# bash a.sh
1 23 ^cterminate the process? (y/n): y
# bash a.sh
1 23 ^cterminate the process? (y/n): n
4 56 ...
謝謝**,真心的希望能幫到您!
《unix高階環境程式設計》訊號 訊號傳送與捕獲
kill 函式是將訊號傳送給程序或程序組,raise 函式是將訊號傳送給自身,他們定義及說明如下所示 cpp view plain copy 訊號傳送與捕獲 函式功能 將訊號傳送給程序或程序組 返回值 若成功則返回0,若出錯則返回 1 函式原型 include intkill pid t pid,i...
linux c 程序間訊號的傳送與接收
訊號不僅可以用於事件的非同步處理,同時也可以用作資料傳輸,一者用於接收資料的程序需要安裝訊號處理函式,專門用於接收訊號,二者用於給指定的程序傳送訊號 傳送訊號的程序是 main.cpp created on jul 15,2014 author john include include includ...
signal 捕捉訊號
file demo6.c synopsis inclue typeof void sighandler t int sighandler t signal int signum,sighandler t handler author mrclimb version 1.1.0 date 2012 0...