国语精品91自产拍在线观看二区_色偷偷五月天_天天射夜夜爽_99久久免费国产特黄_1717国产精品久久

Linux下C編程:信號(hào)處置方法實(shí)習(xí)運(yùn)用

時(shí)間:2022-07-03 02:35:43 其他 我要投稿
  • 相關(guān)推薦

Linux下C編程:信號(hào)處置方法實(shí)習(xí)運(yùn)用

Linux下C編程:信號(hào)處置方法實(shí)習(xí)運(yùn)用

Linux下C編程:信號(hào)處置方法實(shí)習(xí)運(yùn)用

信號(hào)是用于一步作業(yè)的。當(dāng)一個(gè)信號(hào)發(fā)生時(shí),程序會(huì)按照現(xiàn)已設(shè)定好的程序來(lái)實(shí)行相應(yīng)的操作。


進(jìn)程對(duì)信號(hào)處置的方法通常有兩種:


1、捕捉信號(hào):當(dāng)一個(gè)信號(hào)發(fā)送個(gè)進(jìn)程時(shí),該進(jìn)程會(huì)調(diào)用此信號(hào)注冊(cè)的信號(hào)處置函數(shù),來(lái)結(jié)束相應(yīng)的操作。對(duì)應(yīng)于每個(gè)信號(hào)系統(tǒng)通常會(huì)有相應(yīng)的默許處置函數(shù)(通常為間斷進(jìn)程)。所以可以設(shè)置信號(hào)為默許的處置函數(shù)。


2、忽略信號(hào)。當(dāng)信號(hào)發(fā)送時(shí),進(jìn)程忽略信號(hào)。


注:有兩個(gè)信號(hào)是無(wú)法捕捉和忽略的SIGKILL和SIGSTOP。它們是提供給管理員,可以在任何時(shí)辰間斷某個(gè)進(jìn)程而設(shè)定的。


對(duì)信號(hào)處置的需要:在用戶編程時(shí)有時(shí)進(jìn)程需要對(duì)某信號(hào)進(jìn)行當(dāng)即照應(yīng)。對(duì)有些實(shí)時(shí)進(jìn)程來(lái)說(shuō),當(dāng)它實(shí)行時(shí)是不愿意被打斷的,這是就需要把接收的信號(hào)掛起。


信號(hào)的運(yùn)用:


信號(hào)最常見(jiàn)的一個(gè)運(yùn)用便是發(fā)生差錯(cuò)時(shí)通知進(jìn)程結(jié)束。關(guān)于許多差錯(cuò),如bus差錯(cuò),浮點(diǎn)差錯(cuò),調(diào)用內(nèi)存差錯(cuò)等都有相應(yīng)的信號(hào)通知進(jìn)程。


此外信號(hào)還有其他用途。如作業(yè)一個(gè)大型的科學(xué)運(yùn)算程序,如果在一個(gè)無(wú)量循環(huán)頂用printf來(lái)閃現(xiàn)作業(yè)情況,必定構(gòu)成作業(yè)功率的下降。所以通過(guò)信號(hào),人為的向進(jìn)程發(fā)送消息,來(lái)查看作業(yè)情況,就大大的提高了作業(yè)功率。

Linux下C編程:信號(hào)具體含義說(shuō)明

信號(hào)及其簡(jiǎn)介


信號(hào)是一種進(jìn)程通訊的方法,他運(yùn)用于異步作業(yè)的處置。信號(hào)的結(jié)束是一種軟間斷。它被發(fā)送為一個(gè)正在作業(yè)的進(jìn)程,已奉告進(jìn)程某個(gè)作業(yè)發(fā)生了。


1) SIGHUP本信號(hào)在用戶終端聯(lián)接(正;蚍钦)結(jié)束時(shí)宣告,通常是在終端的控制進(jìn)程結(jié)束時(shí),通知同一session內(nèi)的各個(gè)作業(yè),這時(shí)它們與控制終端不再有關(guān).


2) SIGINT程序間斷(interrupt)信號(hào),通常是從終端宣告間斷指令如ctrl+c或鍵


3) SIGQUIT和SIGINT類似,但由QUIT字符(通常是Ctrl+\)來(lái)控制.進(jìn)程在因收到SIGQUIT退出時(shí)會(huì)發(fā)生core文件,在這個(gè)含義上類似于一個(gè)程序差錯(cuò)信號(hào).


4) SIGILL實(shí)行了不合法指令.通常是因?yàn)榭蓪?shí)行文件本身出現(xiàn)差錯(cuò),或許妄圖實(shí)行數(shù)據(jù)段.庫(kù)房溢出時(shí)也有可以發(fā)生這個(gè)信號(hào).


5) SIGTRAP跟蹤騙局信號(hào),由斷點(diǎn)指令或其它trap指令發(fā)生.由debugger運(yùn)用.


6) SIGABRT調(diào)用abort時(shí)發(fā)生的信號(hào),將會(huì)使進(jìn)程非正常結(jié)束。


6) SIGIOT IO差錯(cuò)信號(hào).


7) SIGBUS系統(tǒng)總線差錯(cuò)時(shí)發(fā)生的信號(hào),不合法地址,包括內(nèi)存地址對(duì)齊(alignment)犯錯(cuò).eg:訪問(wèn)一個(gè)四個(gè)字長(zhǎng)的整數(shù),但其地址不是4的倍數(shù).


8) SIGFPE在發(fā)生喪身的算術(shù)運(yùn)算差錯(cuò)時(shí)宣告.不只包括浮點(diǎn)運(yùn)算差錯(cuò),還包括溢出及除數(shù)為0等其它一切的算術(shù)的差錯(cuò).


9) SIGKILL可以間斷任何進(jìn)程的信號(hào),只能由管理員宣告,該信號(hào)不會(huì)被捕捉和忽略。


10) SIGUSR1留給用戶運(yùn)用,用戶可在運(yùn)用程序中自行定義。


11) SIGSEGV妄圖訪問(wèn)未分配給自個(gè)的內(nèi)存,或妄圖往沒(méi)有寫權(quán)限的內(nèi)存地址寫數(shù)據(jù),不合法運(yùn)用內(nèi)存地址信號(hào)。


12) SIGUSR2留給用戶運(yùn)用


13) SIGPIPE當(dāng)一個(gè)進(jìn)程對(duì)管道進(jìn)行完讀后進(jìn)行寫時(shí)發(fā)生的信號(hào)。


14) SIGALRM時(shí)鐘守時(shí)信號(hào),由alarm函數(shù)設(shè)定的時(shí)辰間斷時(shí)發(fā)生的信號(hào)。


15) SIGTERM程序結(jié)束(terminate)信號(hào),與SIGKILL不一樣的是該信號(hào)可以被阻塞和處置.通常用來(lái)需要程序自個(gè)正常退出.shell指令kill缺省發(fā)生這個(gè)信號(hào).


17) SIGCHLD子進(jìn)程結(jié)束或間斷時(shí)發(fā)生該信號(hào),父進(jìn)程會(huì)收到這個(gè)信號(hào).通過(guò)該信號(hào)父進(jìn)程可以知道子進(jìn)程的作業(yè)情況。但大多數(shù)情況下此信號(hào)會(huì)被忽略。


18) SIGCONT讓一個(gè)間斷(stopped)的進(jìn)程繼續(xù)實(shí)行.本信號(hào)不能被阻塞.


19) SIGSTOP間斷(stopped)進(jìn)程的實(shí)行.注意它和terminate以及interrupt的區(qū)別:該進(jìn)程還未結(jié)束,只是暫停實(shí)行.本信號(hào)不能被阻塞,處置或忽略.


20) SIGTSTP間斷進(jìn)程的作業(yè),但該信號(hào)可以被處置和忽略.用戶鍵入SUSP字符時(shí)(通常是Ctrl-Z)宣告這個(gè)信號(hào)


21) SIGTTIN當(dāng)后臺(tái)作業(yè)要從用戶終端讀數(shù)據(jù)時(shí),間斷驅(qū)動(dòng)器發(fā)生的信號(hào)。當(dāng)讀入數(shù)據(jù)的進(jìn)程阻塞或忽略這個(gè)信號(hào),或讀取數(shù)據(jù)的進(jìn)程地址進(jìn)程組是一個(gè)孤立進(jìn)程組時(shí),信號(hào)不會(huì)發(fā)生,而且發(fā)生讀差錯(cuò)。errno被設(shè)為ETO


22) SIGTTOU類似于SIGTTIN,當(dāng)后臺(tái)作業(yè)要從用戶終端讀數(shù)據(jù)時(shí),間斷驅(qū)動(dòng)器發(fā)生的信號(hào)。當(dāng)讀入數(shù)據(jù)的進(jìn)程阻塞或忽略這個(gè)信號(hào),或讀取數(shù)據(jù)的進(jìn)程地址進(jìn)程組是一個(gè)孤立進(jìn)程組時(shí),信號(hào)不會(huì)發(fā)生,而且發(fā)生讀差錯(cuò)。errno被設(shè)為ETO。僅有不一樣的是進(jìn)程可以選擇后臺(tái)寫。


23) SIGURG socket上出現(xiàn)緊急情況是宣告的信息。


24) SIGXCPU逾越CPU時(shí)辰資源束縛.這個(gè)束縛可以由getrlimit/setrlimit來(lái)讀取/改動(dòng)


25) SIGXFSZ逾越文件大小資源束縛.


26) SIGVTALRM虛擬時(shí)鐘信號(hào).類似于SIGALRM,可是核算的是該進(jìn)程占用的CPU時(shí)辰.


27) SIGPROF類似于SIGALRM/SIGVTALRM,但包括該進(jìn)程用的CPU時(shí)辰以及系統(tǒng)調(diào)用的時(shí)辰.


28) SIGWINCH窗口大小改動(dòng)時(shí)宣告.


29) SIGIO文件描述符準(zhǔn)備就緒,可以初步進(jìn)行輸入/輸出操作.


30) SIGPWR Power failure電源失效信號(hào)。


31)SIGEMT實(shí)時(shí)硬件發(fā)生差錯(cuò)時(shí)發(fā)生的信號(hào)。


有兩個(gè)信號(hào)可以間斷進(jìn)程:SIGTERM和SIGKILL。SIGTERM比照和睦,進(jìn)程能捕捉這個(gè)信號(hào),根據(jù)您的需要來(lái)關(guān)閉程序。在關(guān)閉程序之前,您可以結(jié)束翻開(kāi)的記載文件和結(jié)束正在做的任務(wù)。在某些情況下,假定進(jìn)程正在進(jìn)行作業(yè)而且不能間斷,那么進(jìn)程可以忽略這個(gè)SIGTERM信號(hào)。


關(guān)于SIGKILL信號(hào),進(jìn)程是不能忽略的。這是一個(gè)“我不管您在做什么,立刻間斷”的信號(hào)。假定您發(fā)送SIGKILL信號(hào)給進(jìn)程,Linux就將進(jìn)程間斷在那里。


注:有六個(gè)信號(hào)被稱為作業(yè)信號(hào),SIGCHLD,SIGCONT,SIGSTOP,SIGSTP,SIGTTNI,SIGTTOU.這些信號(hào)都是用于協(xié)和諧組織各個(gè)進(jìn)程的,也便是結(jié)束所謂的作業(yè)控制。通常情況下用戶不需要對(duì)這些信號(hào)進(jìn)行處置,shell會(huì)自動(dòng)結(jié)束對(duì)這些信號(hào)的處置作業(yè)。信號(hào)之間是相互影響的,當(dāng)進(jìn)程接收到SIGCONT信號(hào)時(shí),被系統(tǒng)懸掛的SIGSTOP,SIGSTP,SIGTTIN,SIGTTOU將失效。一樣進(jìn)程接收到SIGSTOP,SIGSTP,SIGTTIN,SIGTTOU時(shí),SIGCONT將失效。

Linux下C編程:信號(hào)處置

信號(hào)處置是linux程序的一個(gè)特征。用信號(hào)處置來(lái)仿照操作系統(tǒng)的間斷功用。要想運(yùn)用信號(hào)處置功用,你要做的便是填寫一個(gè)信號(hào)處置函數(shù)即可。


#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:%ld\n",(long)getpid());


while(flag)

pause();

return 0;


}實(shí)行,


#gcc sig.c -o sig


#./sig


在另一終端:


#kill -INT 333//333是程序打印出的進(jìn)程號(hào)