linux程序間通訊 七 訊號通訊

2021-10-04 21:40:40 字數 2462 閱讀 5904

在之前的博文《linux程序間通訊(一)----初識篇》中,我們知道了程序間通訊主要分為三大類,分別是管道通訊,訊號通訊,以及ipc通訊;程序間通訊主要是為了不同程序之間的資料共享,訊號通訊也不例外。

(1)什麼是訊號通訊,或者說什麼是訊號機制?

訊號是軟體層次上對中斷機制的一種模擬,是一種非同步通訊方式。通常如果我們做過微控制器開發,嵌入式底層硬體開發,我們都很熟悉硬體中斷,它是外設工作時給cpu傳送的,是一種非同步通訊方式。

linux核心通過訊號通知程序,不同的訊號型別代表不同的事件,linux對早期的unix訊號機制進行了擴充套件。

(2)檢視當前linux下面支援的訊號型別

(3)程序對訊號的處理方式

預設方式

忽略訊號

捕捉訊號

(4)訊號的相關命令注意這是我們在console終端下可以輸入的命令

1. kill //英文原意是殺死,會讓我們中文使用者產生誤解,既然是殺死是不是意味著停止程序

//實際上是向乙個程序傳送訊號的意思

kill [

-signal] pid // 預設訊號是15 sigterm

-sig 可指定訊號

pid 指定傳送物件

舉例 kill -

96437

2. killall

killall [

-u user | prog]

prog 指定程序名,注意這裡是程序的名字,不是程序pid

user 指定使用者名稱

(5)訊號傳送函式

1. kill

#include

#include

intkill

(pid_t pid,

int sig)

; pid : 指定程序號 0代表同組程序;-

1代表所有除了init程序和當前程序之外的程序

sig : 訊號型別

2. raise

#include

#include

intraise

(int sig)

;3. alarm

intalarm

(unsigned

int seconds)

; seconds 定時器的時間

成功返回上個定時器的剩餘時間,失敗返回eof

經常用來實現超時檢測

4. pause

intpause

(void);

程序一直阻塞,直到而被訊號中斷

5. signal

設定訊號響應方式,請注意這個函式和kill、killall的區別,我們中文使用者會理解為

發訊號,實際上它並不是發訊號

#include

#include

void(*

signal

(int signo,

void

(*handler)

(int))

)(int)

成功返回原先的訊號處理函式,失敗返回sig_err

signo 要設定的訊號型別

handler 指定的訊號處理函式;sig_dfl代表預設方式;sig_ign代表忽略訊號

(1)alarm和pause讀者可以在自己的環境下編譯後執行看一下最後的效果,思考,如果將alarm函式注釋後再執行,會是什麼結果

#include

"stdio.h"

#include

"stdlib.h"

#include

#include

"sys/types.h"

#include

intmain()

(2)傳送訊號signal編譯後執行,分別在console下按下"ctrl+c"和"ctrl+",以及其他任意組合鍵,看運**況

#include

"stdio.h"

#include

"stdlib.h"

#include

#include

"sys/types.h"

#include

void

handler

(int signo)

if(signo == sigquit)

}int

main()

Linux 程序間通訊 訊號

訊號是在軟體層次上對中斷機制的一種模擬,在原理上,乙個程序收到乙個訊號與處理器收到乙個中斷請求可以說是一樣的。訊號是非同步的,乙個程序不必通過任何操作來等待訊號的到達,事實上,程序也不知道訊號到底什麼時候到達。訊號是程序間通訊機制中唯一的非同步通訊機制,可以看作是非同步通知,通知接收訊號的程序有哪些...

Linux程序間通訊 訊號

1.什麼是訊號 訊號是linux系統響應某些條件而產生的乙個事件,接收到該訊號的程序會執行相應的操作。2.訊號的產生 1 由硬體產生,如從鍵盤輸入ctrl c可以終止當前程序 2 由其他程序傳送,如可在shell程序下,使用命令 kill 訊號標號 pid,向指定程序傳送訊號。3 異常,程序異常時會...

Linux程序間通訊 訊號

訊號 signals 是unix 類unix以及其他posix相容的作業系統中程序間通訊的一種有限制的方式。它是一種非同步的通知機制,用來提醒程序乙個事件已經發生。當乙個訊號傳送給乙個程序,作業系統中斷了程序正常的控制流程,此時,任何非原子操作都將被中斷。如果程序定義了訊號的處理函式,那麼它將被執行...