程序之間的常用通訊手段:傳送訊號,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.關於轉型動作會觸發其它動作時,我是很驚訝的。先貼出一段 來看看,轉型並不是...