程序間通訊 訊號

2021-08-09 01:38:47 字數 4857 閱讀 5601

訊號

概念:

訊號是在軟體層次上對中斷機制的一種模擬,它是比較複雜的通訊方式,用於通知程序有某事件發生,乙個程序收到乙個訊號與處理器收到乙個中斷請求效果上可以說是一致的。程序在接收到這個訊號以後,可以設定響應的處理動作:忽略或者呼叫函式進行處理。

在linux下命令列

$kill

-l

可以檢視linux下的所有訊號:一共64個訊號,從1開始編號,其中也存在0號訊號,但是0號訊號是用來測試某個程序是否存在。其中1-32號訊號是經典訊號,不支援排隊的(就是無論產生了多少次該訊號都只當成一次處理),後面的32個訊號是實時訊號常用來驅動程式設計,並且是支援排隊的(產生多少次就記錄多少次,一次一次處理)。

1終端的特殊按鍵:ctrl +c   sigintctrl +z   sigtstpctrl +\   sigquit2、硬體產生:

段錯誤:非法的操作記憶體,然後作業系統傳送11號訊號提示段錯誤

浮點數例外:除0操作提示浮點數例外,cpu不能除0操作,否則傳送8號訊號終止程序。

3、kill函式或者kill命令:(kill  -訊號編號  程序號)

向某乙個程序或者程序組傳送訊號,但是這個時候只能向自己的程序傳送訊號,不能傳送給其他程序。

root使用者可以向所有程序發訊號

4、某種軟體引發的訊號,每個程序有且僅有乙個定時器

int raise(int sig );函式向自己傳送sig號訊號

abort()呼叫程序自己向自己傳送6號訊號(sigabort)終止自己

unsigned int alarm(unsign int second )函式的精度是秒,定時乙個具體的second 秒數,到時之後給傳送自己乙個sigarm訊號終止自己。

程序處理訊號的3種行為

1、預設處理,分以下五種方式

term  終止程序

ign   忽略(層級不同)

stop  暫停

core  先終止程序然後生成core檔案,死後驗屍用於gdb除錯

cont  繼續執行

2、忽略3、捕捉:使用者自定義捕捉函式處理

訊號集處理函式sigset_t為訊號集合(128

位元組)訊號集在程序控制塊中(pcb)有專門用來處理訊號的集合。

#includeint sigempty(sigset_t *set);  //將訊號集都清0int sigfillset(sigset_t *set);  //將訊號集都置1int sigaddset(sigset_t *set,int signo);//將訊號集的某一位置1int sigdlset(sigset_t*set,int signo);//將訊號集的某一位置0

int sigismember(const sigset_t *set, int signo);//判斷某一位訊號是否是1

設定好訊號集後將該訊號集合註冊到當前程序中的阻塞訊號集中。

int  sigprocmask( int how, const*sigset_t *set ,sigset_t *oset);

第乙個set是新傳入進來的引數

第二個oset是舊的訊號遮蔽字是傳出引數,用於備份,不需要時傳null

how 有三種選擇操作:

sig_block    set的訊號遮蔽字中新增到當前訊號遮蔽字

sig_unblock  set訊號遮蔽字中解除阻塞的訊號

sig_setmask   將set完全替換當前的訊號遮蔽字

int sigpending (sigset_t *set)//獲取當前程序的未決訊號集sigkill和sigstop訊號 不可以被阻塞,可以被這兩個訊號強制殺死

訊號的捕捉函式的設定int sigaction(int signum , cosnt struct sigaction  *act ,struct sigaction *oldact);

第乙個是為哪個訊號設定捕捉函式

第二個是為該訊號設定的動作處理函式

第三個是原有的預設處理動作,不關心時傳null

struct sigaction

時間片的輪轉靠的是cpu的定時中斷,核心去剝奪程式使用cpu的權利

系統呼叫都要往核心去呼叫函式,cpu切換到核心狀態。

訊號產生以後並不是第一時間進行響應,中斷產生,cpu才首先處理訊號

作業系統沒有明確定義的訊號,sigusr1和sigusr2預設是終止程序,使用者可以自己定義這兩個訊號的行為

不能隨便更改系統的訊號,如終端按鍵產生的訊號

c標準庫的訊號處理函式

typedef   void (*sighandler_t)(int )sigheadler  signal(intsignum,sighandler_t handler); //在windows上和linux都可以使用。之前的只能在linuxsystem(const char*conmmand);    //集fork() exec()wait()函式一體;

優點是介面簡單,然後使用方便,跨平台

缺點的話:不能更改訊號遮蔽字。功能簡單

程序間通訊 訊號

關於訊號在程序間的通訊,這是乙個比較複雜的東西,本人不在這裡做過多的介紹.如果想系統的學習,請參考 unix環境高階程式設計這本書 我在這裡只展示幾個例子 用守護程序實現檔案的同步.由子程序1改乙個檔案,守護程序2,檢查到檔案已經改變,並通過訊號告訴給父程序,父程序實現輸出.程式有點複雜,但思路還是...

程序間通訊(訊號)

linux系統程序間通訊有很多種方式 較多使用的有訊號,管道以及system vipc。各種通訊方式各有優缺點。這部分主要就程序間通訊方式進行總結。1 訊號。訊號進行程序間通訊方式有一點需要明確 訊號只能通知,不能在程序間共享資料資源。也就是說訊號僅僅是告訴你一下某個事情發生了。而我們的程式則可以對...

程序間通訊 訊號

訊號是程序間通訊機制中唯一的非同步通訊機制,linux系統產生訊號以響應某些條件,當乙個程序接收 捕獲 到乙個訊號會採取相應的行動。其 有兩種 一,硬體,如按下鍵盤或者硬體故障。二,軟體,呼叫傳送訊號的函式 kill,alarm,raise 訊號的種類有以下 1.響應訊號的函式 include 捕獲...