蘇嵌學習之程序通行二訊號通訊

2021-06-20 15:10:10 字數 1689 閱讀 1908

訊號是在軟體層次上對中斷機制的一種模擬,是一種非同步通訊方式

訊號可以直接進行使用者空間程序(註冊和登出[這個登出不是很清楚])和核心程序(核心產生)之間的互動,核心程序也可以利用它來通知使用者空間程序發生了哪些系統事件。

如果該程序當前並未處於執行態,則該訊號就由核心儲存起來,直到該程序恢復執行再傳遞給它;如果乙個訊號被程序設定為阻塞,則該訊號的傳遞被延遲,直到其阻塞被取消時才被傳遞給程序

使用者程序對訊號的響應方式:

忽略訊號:對訊號不做任何處理,但是有兩個訊號不能忽略:即sigkill及sigstop。

捕捉訊號:定義訊號處理函式(後面說),當訊號發生時,執行相應的處理函式。

執行預設操作:linux對每種訊號都規定了預設操作 (man kill 看看,有很多)

訊號傳送與捕捉

:kill()和raise()

kill –l 命令檢視系統支援的訊號列表

raise函式允許程序向自己傳送訊號

#include

#include

int kill(pid_t pid, int sig);(pid = -1,你會關機哦~~~~)

#include

#include

int raise(int sig);

alarm()和pause()

alarm()也稱為鬧鐘函式,它可以在程序中設定乙個定時器。當定時器指定的時間到時,核心就向程序傳送sigalarm訊號。

pause()函式是用於將呼叫程序掛起直到收到訊號為止。

#include

unsigned int alarm(unsigned int seconds)

如果呼叫此alarm()前,程序中已經設定了鬧鐘時間,則

返回上乙個鬧鐘時間的剩餘時間,否則返回0。

#include

int pause(void);

訊號的處理:

訊號處理的主要方法有兩種

使用簡單的signal()函式

使用訊號集函式組 (不大會)

signal()

使用signal函式處理時,需指定要處理的訊號和處理函式

使用簡單、易於理解(這個函式不好理解~~~~)

所需標頭檔案: 

#include

函式原型: 

void (*signal(int signum, void (*handler)(int)))(int);

函式傳入值: 

signum:指定訊號

handler:  sig_ign:忽略該訊號。

sig_dfl:採用系統預設方式處理訊號。

自定義的訊號處理函式指標

函式返回值: 

成功:設定之前的訊號處理方式

出錯:-1

void (*signal(int signo, void (*handler)(int)))(int);就可以看成是signal()函式(它自己是帶兩個引數,乙個為整型,乙個為函式指標的函式), 而這個signal()函式的返回值也為乙個函式指標,這個函式指標指向乙個帶乙個整型引數,並且返回值為void的乙個函式.

在寫訊號處理函式時對於訊號處理的函式也是void sig_fun(int signo);這種型別,恰好與上面signal()函式所返回的函式指標所指向的函式是一樣的.

乙個簡單的例子:

void my_func(int sign_no)

int main()

蘇嵌學習日誌

姓名 盧元玉 日期 2018.7.12.今日學習任務 1.完成老師布置的31 道嵌入式 linux 開發工具篇問題整理 2.完成4個c 語言編寫。今日任務完成情況 1.基本能完成老師給我門布置的三十多道複習題目 2.對程式編寫還存在一定的難度,不過有老師和同學的幫助,最終能順利完成任務。今日開發中出...

蘇嵌學習日誌

學習日誌 姓名 於慧 日期 2018.7.23 今日學習任務 軟體安裝環境 stm32的簡單介紹 了解stm32f4xx的gpio暫存器 用暫存器點亮乙個led燈 了解韌體庫 建立基礎模板 今日任務完成情況 詳細說明本日任務是否按計畫完成,開發的 量 完成軟體安裝 了解了stm32的一些簡單知識 實...

蘇嵌學習日誌

學習日誌 姓名 於慧 日期 2018.7.25 今日學習任務 gpio 時鐘systick系統定時器 今日任務完成情況 詳細說明本日任務是否按計畫完成,開發的 量 使用韌體庫點亮led燈 部分 include bsp led.h include stm32f4xx.h int main void i...