範文齋

位置:首頁 > 校園範文 > 其他

Linux下C程式設計:訊號處置方法實習運用

其他1.96W

Linux下C程式設計:訊號處置方法實習運用

Linux下C程式設計:訊號處置方法實習運用

訊號是用於一步作業的。當一個訊號發生時,程式會按照現已設定好的程式來實行相應的操作。


程序對訊號處置的方法通常有兩種:


1、捕捉訊號:當一個訊號傳送個程序時,該程序會呼叫此訊號註冊的訊號處置函式,來結束相應的操作。對應於每個訊號系統通常會有相應的默許處置函式(通常為間斷程序)。所以可以設定訊號為默許的處置函式。


2、忽略訊號。當訊號傳送時,程序忽略訊號。


注:有兩個訊號是無法捕捉和忽略的SIGKILL和SIGSTOP。它們是提供給管理員,可以在任何時辰間斷某個程序而設定的。


對訊號處置的需要:在使用者程式設計時有時程序需要對某訊號進行當即照應。對有些實時程序來說,當它實行時是不願意被打斷的,這是就需要把接收的訊號掛起。


訊號的運用:


訊號最常見的一個運用便是發生差錯時通知程序結束。關於許多差錯,如bus差錯,浮點差錯,呼叫記憶體差錯等都有相應的訊號通知程序。


此外訊號還有其他用途。如作業一個大型的科學運算程式,如果在一個無量迴圈頂用printf來閃現作業情況,必定構成作業功率的下降。所以通過訊號,人為的向程序傳送訊息,來檢視作業情況,就大大的提高了作業功率。

Linux下C程式設計:訊號具體含義說明

訊號及其簡介


訊號是一種程序通訊的方法,他運用於非同步作業的`處置。訊號的結束是一種軟間斷。它被髮送為一個正在作業的程序,已奉告程序某個作業發生了。


1) SIGHUP本訊號在使用者終端聯接(正常或非正常)結束時宣告,通常是在終端的控制程序結束時,通知同一session內的各個作業,這時它們與控制終端不再有關.


2) SIGINT程式間斷(interrupt)訊號,通常是從終端宣告間斷指令如ctrl+c或鍵


3) SIGQUIT和SIGINT類似,但由QUIT字元(通常是Ctrl+)來控制.程序在因收到SIGQUIT退出時會發生core檔案,在這個含義上類似於一個程式差錯訊號.


4) SIGILL實行了不合法指令.通常是因為可實行檔案本身出現差錯,或許妄圖實行資料段.庫房溢位時也有可以發生這個訊號.


5) SIGTRAP跟蹤騙局訊號,由斷點指令或其它trap指令發生.由debugger運用.


6) SIGABRT呼叫abort時發生的訊號,將會使程序非正常結束。


6) SIGIOT IO差錯訊號.


7) SIGBUS系統匯流排差錯時發生的訊號,不合法地址,包括記憶體地址對齊(alignment)犯錯:訪問一個四個字長的整數,但其地址不是4的倍數.


8) SIGFPE在發生喪身的算術運算差錯時宣告.不只包括浮點運算差錯,還包括溢位及除數為0等其它一切的算術的差錯.


9) SIGKILL可以間斷任何程序的訊號,只能由管理員宣告,該訊號不會被捕捉和忽略。


10) SIGUSR1留給使用者運用,使用者可在運用程式中自行定義。


11) SIGSEGV妄圖訪問未分配給自個的記憶體,或妄圖往沒有寫許可權的記憶體地址寫資料,不合法運用記憶體地址訊號。


12) SIGUSR2留給使用者運用


13) SIGPIPE當一個程序對管道進行完讀後進行寫時發生的訊號。


14) SIGALRM時鐘守時訊號,由alarm函式設定的時辰間斷時發生的訊號。


15) SIGTERM程式結束(terminate)訊號,與SIGKILL不一樣的是該訊號可以被阻塞和處置.通常用來需要程式自個正常退出l指令kill預設發生這個訊號.


17) SIGCHLD子程序結束或間斷時發生該訊號,父程序會收到這個訊號.通過該訊號父程序可以知道子程序的作業情況。但大多數情況下此訊號會被忽略。


18) SIGCONT讓一個間斷(stopped)的程序繼續實行.本訊號不能被阻塞.


19) SIGSTOP間斷(stopped)程序的實行.注意它和terminate以及interrupt的區別:該程序還未結束,只是暫停實行.本訊號不能被阻塞,處置或忽略.


20) SIGTSTP間斷程序的作業,但該訊號可以被處置和忽略.使用者鍵入SUSP字元時(通常是Ctrl-Z)宣告這個訊號


21) SIGTTIN當後臺作業要從使用者終端讀資料時,間斷驅動器發生的訊號。當讀入資料的程序阻塞或忽略這個訊號,或讀取資料的程序地址程序組是一個孤立程序組時,訊號不會發生,而且發生讀差錯。errno被設為ETO


22) SIGTTOU類似於SIGTTIN,當後臺作業要從使用者終端讀資料時,間斷驅動器發生的訊號。當讀入資料的程序阻塞或忽略這個訊號,或讀取資料的程序地址程序組是一個孤立程序組時,訊號不會發生,而且發生讀差錯。errno被設為ETO。僅有不一樣的是程序可以選擇後臺寫。


23) SIGURG socket上出現緊急情況是宣告的資訊。


24) SIGXCPU逾越CPU時辰資源束縛.這個束縛可以由getrlimit/setrlimit來讀取/改動


25) SIGXFSZ逾越檔案大小資源束縛.


26) SIGVTALRM虛擬時鐘訊號.類似於SIGALRM,可是核算的是該程序佔用的CPU時辰.


27) SIGPROF類似於SIGALRM/SIGVTALRM,但包括該程序用的CPU時辰以及系統呼叫的時辰.


28) SIGWINCH視窗大小改動時宣告.


29) SIGIO檔案描述符準備就緒,可以初步進行輸入/輸出操作.


30) SIGPWR Power failure電源失效訊號。


31)SIGEMT實時硬體發生差錯時發生的訊號。


有兩個訊號可以間斷程序:SIGTERM和SIGKILL。SIGTERM比照和睦,程序能捕捉這個訊號,根據您的需要來關閉程式。在關閉程式之前,您可以結束翻開的記載檔案和結束正在做的任務。在某些情況下,假定程序正在進行作業而且不能間斷,那麼程序可以忽略這個SIGTERM訊號。


關於SIGKILL訊號,程序是不能忽略的。這是一個“我不管您在做什麼,立刻間斷”的訊號。假定您傳送SIGKILL訊號給程序,Linux就將程序間斷在那裡。


注:有六個訊號被稱為作業訊號,SIGCHLD,SIGCONT,SIGSTOP,SIGSTP,SIGTTNI,SIGTTOU.這些訊號都是用於協和諧組織各個程序的,也便是結束所謂的作業控制。通常情況下使用者不需要對這些訊號進行處置,shell會自動結束對這些訊號的處置作業。訊號之間是相互影響的,當程序接收到SIGCONT訊號時,被系統懸掛的SIGSTOP,SIGSTP,SIGTTIN,SIGTTOU將失效。一樣程序接收到SIGSTOP,SIGSTP,SIGTTIN,SIGTTOU時,SIGCONT將失效。

Linux下C程式設計:訊號處置

訊號處置是linux程式的一個特徵。用訊號處置來仿照作業系統的間斷功用。要想運用訊號處置功用,你要做的便是填寫一個訊號處置函式即可。


#include

#include

#include

#include


int flag = 1;


void func(int sig)


{

printf("I get a signal!n");

flag = 0;


}


int main()


{

signal(SIGINT, func);

printf("pid:%ldn",(long)getpid());


while(flag)

pause();

return 0;


}實行,


#gcc sig.c -o sig


#./sig


在另一終端:


#kill -INT 333//333是程式打印出的程序號