Shell 訊號傳送與捕捉

2021-09-04 06:41:16 字數 3454 閱讀 9717

防偽碼:李白乘舟將欲行,忽聞岸上踏歌聲。

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...