訊號是在軟體層次上對中斷機制的一種模擬,是一種非同步通訊方式
訊號可以直接進行使用者空間程序(註冊和登出[這個登出不是很清楚])和核心程序(核心產生)之間的互動,核心程序也可以利用它來通知使用者空間程序發生了哪些系統事件。
如果該程序當前並未處於執行態,則該訊號就由核心儲存起來,直到該程序恢復執行再傳遞給它;如果乙個訊號被程序設定為阻塞,則該訊號的傳遞被延遲,直到其阻塞被取消時才被傳遞給程序
使用者程序對訊號的響應方式:
忽略訊號:對訊號不做任何處理,但是有兩個訊號不能忽略:即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...