訊號的概念

2022-04-04 08:05:00 字數 1705 閱讀 9612

訊號(signal)--     程序之間通訊的方式,是一種軟體中斷。乙個程序一旦接收到訊號就會打斷原來的程式執行流程來處理訊號。

幾個常用訊號:

sigint     終止程序  中斷程序  (control+c)

sigterm   終止程序     軟體終止訊號

sigkill   終止程序     殺死程序

sigalrm 鬧鐘訊號

sigterm比較友好,程序能捕捉這個訊號,根據您的需要來關閉程式。在關閉程式之前,您可以結束開啟的記錄檔案和完成正在做的任務。在某些情況下,假如程序正在進行作業而且不能中斷,那麼程序可以忽略這個sigterm訊號。

對於sigkill訊號,程序是不能忽略的。這是乙個 「我不管您在做什麼,立刻停止」的訊號。假如您傳送sigkill訊號給程序,linux就將程序停止在那裡。

1(被動式)  核心檢測到乙個系統事件.例如子程序退出會像父程序傳送sigchld訊號.鍵盤按下control+c會傳送sigint訊號

2(主動式)  通過系統呼叫kill來向指定程序傳送訊號

作業系統規定了程序收到訊號以後的預設行為

但是,我們可以通過繫結訊號處理函式來修改程序收到訊號以後的行為

有兩個訊號是不可更改的sigtop和sigkill

繫結訊號處理函式

import

os

import

signal

from time import

sleep

defonsignal_term(a,b):

print

'收到sigterm訊號'#

這裡是繫結訊號處理函式,將sigterm繫結在函式onsignal_term上面

signal.signal(signal.sigterm,onsignal_term)

defonsignal_usr1(a,b):

print

'收到sigusr1訊號'#

這裡是繫結訊號處理函式,將sigusr1繫結在函式onsignal_term上面

signal.signal(signal.sigusr1,onsignal_usr1)

while 1:

print

'我的程序id是

',os.getpid()

sleep(10)

執行該程式。然後通過另外乙個程序來傳送訊號。

傳送訊息的**如下:

import

os

import

signal

#傳送訊號,16175是前面那個繫結訊號處理函式的pid,需要自行修改

os.kill(16175,signal.sigterm)

#傳送訊號,16175是前面那個繫結訊號處理函式的pid,需要自行修改

os.kill(16175,signal.sigusr1)

使用訊號需要特別注意的地方

如果乙個程序收到乙個sigusr1訊號,然後執行訊號繫結函式,第二個sigusr2訊號又來了,第乙個訊號沒有被處理完畢的話,第二個訊號就會丟棄。

所以,盡量不要在多執行緒中使用訊號。

這個不妥,測試沒發現有訊號丟失

例子演示:

接收訊號的程式,你會發現如果有另外一端使用多執行緒向這個程序傳送訊號,會遺漏一些訊號。

訊號相關概念

我記得我在程序間通訊的時候說到過一種方式 訊號量 終止在linux命令列上正在執行的可執行程式所用的ctrl c,也屬於一種訊號 是常見sigint訊號 所以,今天我想具體分享一下與訊號相關的一些概念。linux中訊號共有64個,常見訊號量只有31個,利用kill l命令就可以用來檢視全部訊號,如下...

訊號的基本概念以及訊號的產生

一.訊號產生的場景 1.使用者輸入命令,在shell 啟動乙個前台程序 2.當使用者按一下 ctrl c 的時候,從鍵盤產生乙個硬體中斷 3.此時cpu 正在執行這個程序的帶 則該程序的執行 暫停執行,cpu 從使用者態切換到核心態處理該硬體中斷.4.中斷驅動程式將ctrl c 解釋為乙個 sigi...

linux 訊號相關概念

訊號的阻塞就是讓系統暫時保留訊號待以後傳送。由於另外有辦法讓系統忽略訊號,所以一般情況下訊號的阻塞只是暫時的,只是為了防止訊號打斷敏感的操作。當需要修改某些全域性變數時,可以通過sigprocmask 函式阻塞處理函式中也使用該變數的訊號。在某些訊號處理函式中,為了防止同類訊號的到來,可以使用sig...