3 3 訊號的概念 認識 處理動作

2021-10-03 15:03:15 字數 3211 閱讀 4253

程序之間的常用通訊手段:傳送訊號,kill 第二章第二節講過;

上節討論過 sighup

訊號 :通知(事情通知),用來通知某個程序發生了某乙個事情;

事情,訊號都是突發事件, 訊號是非同步發生的,訊號也被稱呼為「軟體中斷」

訊號如何產生:

a)某個程序傳送給另外乙個程序或者傳送給自己;

b)由核心(作業系統)傳送給某個程序

b.1)通過在鍵盤輸入命令ctrl+c[中斷訊號],kill命令

b.2)記憶體訪問異常,除數為0等等,硬體都會檢測到並且通知核心;

訊號名字,都是以sig開頭,上節課sighup(終端斷開訊號)

unix以及類(類似)unix作業系統(linux,freebsd,solaris);支援的訊號數量各不相同。10-60多個之間;

訊號既有名字,其實也都是一些數字,訊號是一些正整數常量;訊號就是巨集定義(數字,從1開始)

#include (/usr/include/)

gcc 編譯

標頭檔案,包含路徑:/user/local/include/ /usr/include/

庫檔案,連線路徑:/usr/ local/lib/ /usr/lib

//sudo find / -name "signal.h" | xargs grep -in "sighup"
kill :kill 程序id ,他的工作是發個訊號給程序;

kill能給程序傳送多種訊號;

ps -eo pid,ppid,sid,tty,pgrp,comm | grep -e 『bash|pid|nginx』

sudo strace -e trace=signal -p 1184

a)如果你單純的用kill 程序id,那麼就是往 程序傳送sigterm訊號(終止訊號)

kill -數字 程序id,能發出跟這個數字對應的訊號 -1 程序id,sighup訊號去

b)如果我門用kill -1 程序id,那麼就是往程序nginx傳送sighup終止訊號;同時程序nginx就被終止掉了;

c)kill -2 程序id,傳送sigint訊號;

kill -數字 程序id ,能傳送出多種訊號;

kill 命令不同數字所能發出的不同訊號:

ps aux | grep -e 『bash|pid|nginx』 //aux所謂bsd風格顯示格式;

kill只是發個訊號,而不是單純的殺死的意思。

當某個訊號出現時,我們可以按三種方式之一進行處理,我們稱之為訊號的處理或者與訊號相關的動作;

(1)執行系統預設動作 ,絕大多數訊號的預設動作是殺死你這個程序;

(2)忽略此訊號(但是不包括sigkill和sigstop)

//signal(sighup,sig_ign); 我收到這個訊號後,請作業系統不要乾掉我;

kill -9 程序id,是一定能夠把這個程序殺掉的;

(3)捕捉該訊號:我寫個處理函式,訊號來的時候,我就用處理函式來處理;(但是不包括sigkill和sigstop)

c++ 訊號處理庫提供了 signal 函式,用來捕獲突發事件。以下是 signal() 函式的語法:

void

(*signal (

int sig,

void

(*func)

(int))

)(int)

;

這個函式接收兩個引數:第乙個引數是乙個整數,代表了訊號的編號;第二個引數是乙個指向訊號處理函式的指標。

讓我們編寫乙個簡單的 c++ 程式,使用 signal() 函式捕獲 sigint 訊號。不管您想在程式中捕獲什麼訊號,您都必須使用 signal 函式來註冊訊號,並將其與訊號處理程式相關聯。看看下面的例項:

#include

#include

using

namespace std;

void

signalhandler

(int signum )

int main (

)return0;

}

當上面的**被編譯和執行時,它會產生下列結果:

going to sleep…

going to sleep…

going to sleep…

現在,按 ctrl+c 來中斷程式,您會看到程式捕獲訊號,程式列印如下內容並退出:

going to sleep…

going to sleep…

going to sleep…

interrupt signal (2) received.

您可以使用函式 raise() 生成訊號,該函式帶有乙個整數訊號編號作為引數,語法如下:

int raise (signal sig)

;

在這裡,sig 是要傳送的訊號的編號,這些訊號包括:sigint、sigabrt、sigfpe、sigill、sigse**、sigterm、sighup。以下是我們使用 raise() 函式內部生成訊號的例項:

#include

#include

using

namespace std;

void

signalhandler

(int signum )

int main (

)sleep(1

);}return0;

}

當上面的**被編譯和執行時,它會產生下列結果,並會自動退出:

going to sleep…

going to sleep…

going to sleep…

interrupt signal (2) received.

(2 2)訊號的概念,認識,處理動作

程序之間的常用通訊手段 傳送訊號,kill 第二章第二節講過 上節課討論過 sighup 訊號 通知 事情通知 用來通知某個程序發生了某乙個事情 事情,訊號都是突發事件,訊號是非同步發生的,訊號也被稱呼為 軟體中斷 訊號如何產生 a 某個程序傳送給另外乙個程序或者傳送給自己 b 由核心 作業系統 傳...

數字訊號處理的重要概念

1 為什麼 h n 單位取樣響應那麼重要?2 線性卷積的定義及其運算規律,時域系統的響應y n 等於系統函式h n 與輸入訊號的卷積 卷積的定義 意義。但由於時域求卷積運算量大,所以常用變化域求卷積 3 線性卷積的 法,摺疊 移位 相乘 相加 4 穩定系統是指每個有界的輸入x n 都產生有界輸出y ...

C 轉型動作的新認識

之前學習c c 的時候一直都認為型別轉換 不管是顯式的還是隱式的 其實什麼都沒有做,只是告訴編譯器型別改變了一下,讓它的翻譯記憶體二進位制資料的時候以新型別的套路去翻譯而已。然而當我看到effective c rule 27.關於轉型動作會觸發其它動作時,我是很驚訝的。先貼出一段 來看看,轉型並不是...