程序間通訊 訊號

2021-10-03 23:32:09 字數 3030 閱讀 6734

4,**分析

5,其他

訊號是軟體中斷;訊號提供了一種處理非同步事件的方法:終端使用者鍵入中斷鍵,則會通過訊號機構停止乙個程式;是一種非同步通訊方式。

linux下檢視支援的訊號列表,可以直接輸入kill -l;

簡要說明;

名稱 說明

sighup 終止程序 終端線路結束通話

sigint   終止程序 中斷程序

sigquit   建立core檔案   終止程序,並且生成core檔案

sigill   建立core檔案 非法指令

sigtrap   建立core檔案 跟蹤自陷

sigbus   建立core檔案 匯流排錯誤

sigse**   建立core檔案 段非法錯誤

sigfpe   建立core檔案 浮點異常

sigiot   建立core檔案 執行i/o自陷

sigkill   終止程序 殺死程序

sigpipe   終止程序 向乙個沒有讀程序的管道寫資料

sigalarm   終止程序 計時器到時

sigterm   終止程序 軟體終止訊號

sigstop   停止程序 非終端來的停止訊號

sigtstp   停止程序 終端來的停止訊號

sigcont   忽略訊號 繼續執行乙個停止的程序

sigurg   忽略訊號 i/o緊急訊號

sigio   忽略訊號 描述符上可以進行i/o

sigchld   忽略訊號 當子程序停止或退出時通知父程序

sigttou   停止程序 後台程序寫終端

sigttin   停止程序 後台程序讀終端

sigxgpu   終止程序 cpu時限超時

sigxfsz   終止程序 檔案長度過長

sigwinch   忽略訊號 視窗大小發生變化

sigprof   終止程序 統計分布圖用計時器到時

sigusr1   終止程序 使用者定義訊號1

sigusr2   終止程序 使用者定義訊號2

si**talrm  終止程序 虛擬計時器到時

訊號的處理方式有3種

1 忽略(就是不管你發啥我都不理你)

2預設處理方式(會終止乙個程序)

3自定義處理方式(通過訊號執行自定義函式)

#include

void

(*signal (

int signo ,

void

(*func)

(int))

)(int)

;

返回:成功則為以前的訊號處理配置,若出錯則為 sig_err

signal函式的原型說明此函式要求兩個引數,返回乙個函式指標,而該指標所指向的函式 無返回值(void)。

第乙個引數signo是乙個整型數,

第二個引數是函式指標,它所指向的函式需 要乙個整型引數,無返回值。用一般語言來描述也就是要向訊號處理程式傳送乙個整型引數, 而它卻無返回值。當呼叫signal設定訊號處理程式時,第二個引數是指向該函式 (也就是訊號處 理程式)的指標。signal的返回值則是指向以前的訊號處理程式的指標。

#include

#include

#include

#include

int child_run =0;

int parent_run =0;

void

sig_child

(int signum)

//子程序訊號處理函式

}void

sig_parent

(int signum)

//父程序的訊號處理函式

}int

main

(int argc,

char

**ar**)

//子程序

if(pid ==0)

kill

(getppid()

,sigusr2)

;//子程序給父程序發執行訊號

return0;

}else

printf

("parent_fork start\n");

waitpid

(&child_statu)

;//父程序等待子程序退出,避免僵死程序

}return0;

}

在上面的**中使用到了該函式來進行傳送訊號(此程式實際上是使用 kill 函式來傳送訊號。也常用此命令終止乙個失控的後台程序。)

#include

#include

intkill

(pid_t pid,

int sig)

;

pid:程序id (process id)

sig:要傳送的訊號

pid: 取值有 4 種情況:

pid > 0: 將訊號傳送給程序 id 為pid的程序。

pid = 0: 將訊號傳送給當前程序所在程序組中的所有程序。

pid = -1: 將訊號傳送給系統內所有的程序。

pid < -1: 將訊號傳給指定程序組的所有程序。這個程序組號等於 pid 的絕對值。

signum: 訊號的編號,這裡可以填數字編號,也可以填訊號的巨集定義,可以通過命令kill -l (「l」 為字母)進行相應檢視。

返回值 : 成功返回 0; 錯誤返回 1

ps:檢視程序狀態 (乙個瞬間的程序狀態,靜態)

top:「實時檢視」 ,按q退出 (實時動態顯示)

pstree 樹狀檢視 (可以看出所屬子程序)

kill -s 指定傳送乙個訊號 程序的pid

killall:指定乙個應用程式名字去傳送訊號

kill -l 檢視系統有什麼訊號

終端上按「ctrl+c」組合鍵通常產生中斷訊號 sigint,終端上按「ctrl+\」鍵通常產生中斷訊號 sigquit,終端上按「ctrl+z」鍵通常產生中斷訊號 sigstop 等。

程序間通訊 訊號

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

程序間通訊(訊號)

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

程序間通訊 訊號

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