Linux訊號型別

2021-10-14 15:23:15 字數 3880 閱讀 5203

訊號(signal):訊號是在軟體層次上對中斷機制的一種模擬,通過給乙個程序傳送訊號,執行相應的處理函式。

程序可以通過三種方式來響應乙個訊號:

1)忽略訊號,即對訊號不做任何處理,其中有兩個訊號不能忽略:sigkill及sigstop。

2)捕捉訊號。

3)執行預設操作,linux對每種訊號都規定了預設操作。

linux究竟採用上述三種方式的哪乙個來響應訊號呢?取決於傳遞給響應的api函式。

linux支援的訊號有:

編號

訊號名稱

預設動作

描述

sighup

終止終止程序,掛起

sigint

終止鍵盤輸入中斷命令,一般是ctrl+c

sigquit

coredump

鍵盤輸入退出命令,一般是ctrl+\

sigill

coredump

非法指令

sigtrap

coredump

trap指令發出,一般除錯用

sigabrt

coredump

abort(3)發出的終止訊號

sigbus

coredump

非法位址

sigfpe

coredump

浮點數異常

sigkill

終止立即停止程序,不能捕獲,不能忽略

sigusr1

終止使用者自定義訊號1,像nginx就支援usr1訊號,用於過載配置,重新開啟日誌

sigse**

coredump

無效記憶體引用

sigusr2

終止使用者自定義訊號2

sigpipe

終止管道不能訪問

sigalrm

終止時鐘訊號,alrm(2)發出的終止訊號

sigterm

終止終止訊號,程序會先關閉正在執行的任務或開啟的檔案再終止,有時間程序在有執行的任務而忽略此訊號。不能捕捉

sigstkflt

終止處理器棧錯誤

sigchld

可忽略子程序結束時,父程序收到的訊號

sigcont

可忽略讓終止的程序繼續執行

sigstop

停止停止程序,不能忽略,不能捕獲

sigstp

停止停止程序,一般是ctrl+z

sigttin

停止後台程序從終端讀資料

sigttou

停止後台程序從終端寫資料

sigurg

可忽略緊急陣列是否到達socket

sigxcpu

coredump

超出cpu占用資源限制

sigxfsz

coredump

超出檔案大小資源限制

si**talrm

終止虛擬時鐘訊號,類似於sigalrm,但計算的是程序占用的時間

sigprof

終止類似與sigalrm,但計算的是程序占用cpu的時間

sigwinch

可忽略視窗大小改變發出的訊號

sigio

終止檔案描述符準備就緒,可以輸入/輸出操作了

sigpwr

終止電源失敗

sigsys

coredump

非法系統呼叫

coredump(核心轉儲):當程式執行過程中異常退出時,核心把當前程式在記憶體狀況儲存在乙個core檔案中,以便除錯。

linux支援兩種訊號:

一種是標準訊號,編號1-31,稱為非可靠訊號(非實時),不支援佇列,訊號可能會丟失,比如傳送多次相同的訊號,程序只能收到一次,如果第乙個訊號沒有處理完,第二個訊號將會丟棄。

另一種是擴充套件訊號,編號32-64,稱為可靠訊號(實時),支援佇列,發多少次程序就可以收到多少次。

訊號型別比較多,我們只要了解下,記住幾個常用訊號就行了,紅色標記的我覺得需要記下。

傳送訊號一般有兩種情況:

一種是核心檢測到系統事件,比如鍵盤輸入ctrl+c會傳送sigint訊號。

另一種是通過系統呼叫kill命令來向乙個程序傳送訊號。

kill命令傳送訊號給程序。

命令格式:kill [-s sigspec | -n signum | -sigspec] pid | jobspec ...

kill -l [sigspec]

-s  # 訊號名稱

-n  # 訊號編號

-l  # 列印編號1-31訊號名稱

示例:

給乙個程序傳送終止訊號:kill -s sigterm pidkill -n 15 pidkill -15 pidkill -trem pid
trap命令定義shell指令碼在執行時根據接收的訊號做相應的處理。

命令格式:trap [-lp] [[arg] signal_spec ...]

-l          #列印編號1-64編號訊號名稱

arg         # 捕獲訊號後執行的命令或者函式

signal_spec # 訊號名或編號

一般捕捉訊號後,做以下幾個動作:

1)清除臨時檔案

2)忽略該訊號

3)詢問使用者是否終止指令碼執行

示例1:按ctrl+c不退出迴圈

#!/bin/bashtrap "" 2    # 不指定arg就不做任何操作,後面也可以寫多個訊號,以空格分隔for i in ; doecho $isleep 1done# bash a.sh123^c456^c78910
示例2:迴圈列印數字,按ctrl+c退出,並列印退出提示

#!/bin/bashtrap "echo 'exit...';exit" 2for i in ; doecho  $isleep  1done# bash test.sh123^cexit...
示例3:讓使用者選擇是否終止迴圈

#!/bin/bashtrap "func" 2func()for i in ; doecho $isleep 1done# bash a.sh123^cterminate the process? (y/n): y# bash a.sh123^cterminate the process? (y/n): n456...

linux訊號 阻塞訊號

1.訊號在核心中的表示 我們知道了訊號產生的各種原因,而實際執行訊號處理的動作,叫做訊號遞達 delivery 訊號從產生到遞達之間的狀態,稱為訊號未決 pending 程序可以選擇阻塞 block 某個訊號。被阻塞的訊號產生時將保持在未決狀態,直到程序解除對此訊號的阻塞,才執行遞達的動作。注意,阻...

Linux程序訊號 訊號處理

一 訊號相關概念 1.實際執行訊號的處理動作稱為訊號遞達 delivery 2.訊號從產生到遞達之間的狀態稱為訊號未決 pending 不一定會立即delivery 3.程序可以選擇阻塞 block 某個訊號。不會遞達 4.被阻塞的訊號產生時將保持在未決狀態,知道程序解除對此訊號 的阻塞,才會執行遞...

訊號量型別

sighup 終止程序 終端線路結束通話 sigint 終止程序 中斷程序 sigquit 建立core檔案終止程序,並且生成core檔案 sigill 建立core檔案 非法指令 sigtrap 建立core檔案 跟蹤自陷 sigbus 建立core檔案 匯流排錯誤 sigsegv 建立core檔...