訊號就是軟中斷,程序在執行的過程中,如果有訊號到來,程序呼叫訊號處理程式.處理完畢程序繼續執行.每個程序都有訊號的處理程式,程序的訊號處理程式繼承自父程序.系統為使用者提供了1-64號訊號,沒有32 33號,共62個。
過程:訊號的產生 訊號的遞達 訊號的處理
未決訊號:訊號從產生到訊號處理之前,訊號處於未決狀態,稱這種狀態的訊號為未決訊號
處理訊號的三種方法:1預設處理 2忽略 3使用者自定義
#include
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);
功能:改變程序的訊號處理函式。man手冊:signal()函式在unix的不同版本之間有所不同,在不同版本的linux上也有所不同,為了避免這個問題,可以參見sigaction(2)函式
引數:
signum 指定訊號編號
handler 指定處理函式 ,可以為以下兩個巨集,也可以為函式入口位址
sig_ign 忽略signum代表的訊號,sigalrm,sigstop不能被忽略
sig_dfl 採取預設的方式處理signum訊號,大部分訊號是終止當前程序,與訊號的產生有關
返回值:
錯誤 sig_err errno被設定
成功 返回原來的訊號處理函式的入口位址
#include
#include
//自定義訊號處理函式
void
handle
(int n)
intmain()
產生方式
(1) 硬體產生訊號 ctrl+c ctrl+
(2) 使用命令給程序傳送訊號 kill -訊號編號 程序的pid
(3) 使用系統呼叫或者庫函式向程序傳送訊號 kill(2) raise(3) alarm(2)
#include
#include
int kill(pid_t pid, int sig);
功能:將sig指定的訊號傳送給pid指定的程序
引數:pid 指定了目標程序的pid
sig 指定了訊號編號
返回值:
成功 0
錯誤 -1 errno被設定
p_kill.c
#include
#include
#include
#include
intmain
(int argc,
char
*ar**)
int flag =
kill
(atoi
(ar**[2]
),atoi
(ar**[1]
));if
(-1== flag)
e_msg
("kill",-
1);return0;
}
執行效果:首先將其編譯 gcc t_kill.c -o t_kill,生成可執行檔案t_kill,在bash中執行語句t_kill 訊號編號 pid
等價於bash下使用者命令kill -訊號 pid
#include
unsigned int alarm(unsigned int seconds);
功能:設定乙個鬧鐘,到seconds指定的秒的時候,產生sigalrm訊號,將訊號傳送給當前程序.
引數:seconds 在seconds秒之後產生sigalrm訊號
如果seconds是0.將取消之前設定的所有未決鬧鐘(如果不是未決鬧鐘,說明這個鬧鐘已經發出了訊號,可以理解為鬧鐘已經響過了,也就談不上取消不取消了,所以這裡說取消的是「未決鬧鐘」後有詳細解釋).
返回值:
如果沒有原來設定的鬧鐘,返回0
返回和該鬧鐘挨著的,上乙個鬧鐘的未決的時間值,如果上乙個鬧鐘「響過了」,則其未決時間值為0.
基本功能測試
#include
#include
intmain
(void
)
執行結果部分圖如下,列印到340853就終止了
)執行效果如下,返回了alarm(10)的剩餘時間9,並且程式沒有進入while(1)死迴圈之後,被alarm(3)終止程序,注意alarm(0)取消的是未決鬧鐘,即還在計數中的鬧鐘, 假設程式從alarm(5)執行到int val=alarm(0)
花費的時間大於5秒,即alarm(5)計時結束,發出sigalrm訊號給程序,但此時還沒有執行到int val=alarm(0)
,程式就會由於沒有自定義sigalrm訊號而採取預設處理方式——結束程序。如果用signal()函式自定義了sigalrm訊號的處理函式為列印hello,且alarm(5)到int val=alarm(0)
花費的時間大於5秒小於10秒,那麼alarm(5)會列印乙個hello,但是alarm(10)不會,因為在執行到alarm(10)之前,已經執行到了int val=alarm(0)
,所以把在int val=alarm(0)
之前的且還沒計時結束的鬧鐘(未決鬧鐘)取消。
C語言 unix c 訊號基礎
二 訊號的基礎 1 什麼是訊號 訊號就是 軟中斷 軟中斷就是軟體模擬的中斷機制。2 中斷是什麼 正常的執行流程,訊號處理程式是兩條執行路線,但是屬於同乙個程序 3 系統為我們提供了哪些訊號?kill l 察看系統的中斷 64個訊號,32,33沒有 tarena ubuntu kill l 1 sig...
C語言 unix c 訊號阻塞和未決訊號
五 訊號阻塞和未決訊號 訊號集型別 sigset t 系統對sigset t型別進行了封裝 include int sigemptyset sigset t set 功能 初始化訊號集,不包含任何訊號 引數 set 指定要初始化的訊號集 返回值 0 成功 1 錯誤 int sigfillset si...
Unix C學習之資料夾操作
資料夾的內容 資料夾的內容就是資料夾裡的檔案或資料夾 資料夾的許可權 r讀 w寫 x可通過 dir opendir const char name include include 功能 開啟乙個資料夾 引數 name 指定要開啟的資料夾的名字 返回值 錯誤 null errno被設定 成功 返回乙個...