C語言的中斷訊號

2021-07-05 06:22:32 字數 2428 閱讀 4083

訊號:

中斷訊號 ----- 軟中斷(sigsegv)、硬中斷(sigint ctrl+c)

gec@ubuntu:/$ kill -l

1) sighup

2) sigint

3) sigquit

4) sigill

5) sigtrap

6) sigabrt

7) sigbus

8) sigfpe

9) sigkill

10) sigusr1

11) sigsegv

12) sigusr2

13) sigpipe

14) sigalrm

15) sigterm

16) sigstkflt

17) sigchld

18) sigcont

19) sigstop

20) sigtstp

21) sigttin

22) sigttou

23) sigurg

24) sigxcpu

25) sigxfsz

26) sigvtalrm

27) sigprof

28) sigwinch

29) sigio

30) sigpwr

31) sigsys

1) sighup  終端關閉時候核心發出的訊號    預設是終止程序

2)sigint ctrl + c

終止3: sigquit ctrl+\

終止quit (core dumped)

4: sigabrt abort

終止 9: sigkill 該訊號才是殺死 kill -9 pid  終止  killed (不能更改其預設處理方式)

10 12 :使用者自定義功能的訊號

忽略11: sigsegv 段錯誤

終止13:sigpipe 沒有讀端但是又去write的時候產生的  

終止14) sigalrm  和alarm()函式配合,定時觸發該訊號

終止15:sigterm 終止 (ctrl+ ?)

17: sigchld 子程序退出時候核心產生的

忽略19: sigstop 程序暫停

stoped  (不能更改其預設處理方式) t    01:16   0:00 ./signal 可以再傳送sigcont恢復執行

作用:直接進行使用者空間程序和核心程序間的互動 

核心程序利用訊號來通知使用者空間程序發生哪些系統事件

訊號的傳送

kill -int 4980 

kill(pid , 訊號)

raise(訊號) ---- 傳送個訊號給本程序

訊號的捕獲:

signal(訊號 , 訊號處理函式(自定義函式 , sig_dfl, sig_ign);

alarm  產生定時訊號

alarm(0) ; 取消鬧鐘

alarm(10);   --- 10秒後會產生sigalrm

如果10秒沒有到,過了3秒又設定乙個鬧鐘

int ltime  =  alarm(5);

這個時候ltime 就等於上個鬧鐘的剩餘時間,7

如果沒有正在跑的鐘, 那alarm會返回0

sleep睡眠時候也能響應alrm訊號

pause 

pause();

等待捕獲到程序中註冊了訊號處理函式的訊號,進入的是sleep狀態

例項:在父、子程序之間的訊號處理

#include #include #include #include int global_var = 5;

void func(int sig)

void func_1(int sig)

int main(int argc, char **argv)

} else// pid > 0 // 父程序,變數pid為子程序pid

}//這裡要保持父程序沒結束才能捕獲訊號。

//因為2個程序都有while死迴圈,所以最下面的那句不執行了。

} printf(" var = %d, global = %d \n\n", var,global_var); // 父 、子程序都會呼叫

exit(0);

}

延時訊號:

#include #include #include #include void func(int sig)

void alarm_f(int sig)

void main()

/* alarm是延多少時,然後執行alarm的中斷訊號,返回的是剩下的秒數

pause是讓目前的程序暫停,等到中斷訊號來了,再繼續。

所以waiting...不會一直輸出。是等到有中斷訊號來了再輸出

reference:

*/ exit(0);

}

訊號與中斷

訊號是系統為了響應某些狀況而產生的事件,程序收到訊號後應該採取相應的動作。用來通知程序發生了非同步事件。訊號與中斷的相似點 1 採用了相同的非同步通訊方式 2 當檢測出有訊號或中斷請求時,都暫停正在執行的程式而轉去執行相應的處理程式 3 都在處理完畢後返回到原來的斷點 4 對訊號或中斷都可進行遮蔽 ...

c語言 訊號

沒有被當前程序處理的訊號,因為阻塞問題這個訊號就不會被程序處理 kill 傳送訊號給某個程序 int kill pid t pid,int sig kill l include include include intmain int argc,char ar else if pid 0 return...

訊號和中斷的聯絡

經常見到訊號和中斷這兩個名詞,好像有中斷的地方就有訊號的概念,但是在介紹訊號的地方卻並沒有提及中斷,而這兩者又不存在包含關係。那麼,到底什麼是訊號,什麼是中斷?訊號的概念 訊號是資訊的一種表達形式 舉實際生活中例子來說 我們倆認識,我向你招一下手,就是在向你發乙個訊號。而你看到了我向你招手,就表示你...