Unix C學習之訊號 signal

2021-09-29 08:16:55 字數 2909 閱讀 7954

訊號就是軟中斷,程序在執行的過程中,如果有訊號到來,程序呼叫訊號處理程式.處理完畢程序繼續執行.每個程序都有訊號的處理程式,程序的訊號處理程式繼承自父程序.系統為使用者提供了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被設定 成功 返回乙個...