Linux下訊號的簡單使用

2022-03-25 10:28:21 字數 2369 閱讀 2376

1,1個main, 包含2個while, 

不要被兩個while中的sleep所迷惑,這裡只有main()這乙個主線程(程序)在執行,程式會按照自上而下順序執行。

遇到第1個while迴圈中的sleep時,本執行緒暫停執行,交給其它執行緒處理,但是因為該程序只有乙個執行緒,所以只有靜靜的sleep到指定時間(1s)後,再繼續暫停點處的迴圈,

但因為第1個while迴圈的條件仍然成立,所以執行的仍然是第1個while迴圈體。

我原來想的結果是i=1,會和i=1000交叉著列印,其實這種想法是錯誤的。

該程式在按下ctrl+c時,會直接退出。

#include #include 

#include

#include

#include

using

namespace

std;

intmain()

int j = 1000

;

while

(j)

return0;

}

輸出結果:

[root@localhost test]# ./a.out

i=1i=2

i=3i=4

i=5i=6

i=7i=8

^c

2,帶有signal處理函式的while例子

該例子中仍有2個while迴圈,處理signal的斷點放在了第1個while迴圈體內。

因為加了signal處理函式,此時程式會響應ctrl+c,下面分析一下:

程式開始執行第1個while迴圈體,列印1,2,3,,

如遇到ctrl+c,響應中斷(列印catch語句並置g_sigid),然後回到迴圈體,g_sigid條件成立,退出第1個while迴圈。

然後執行第2個while迴圈體,列印1000,1001,,

這時如遇到ctrl+c,仍然無法阻擋第2個迴圈繼續下去的腳步,因為這個while裡面沒有設定阻止條件,不像第1個while那樣,在迴圈體內對g_sigid做判斷做為阻止條件。

而且我們自定義的對ctrl+c訊號的操作,所以程式也不會退出,

直到遇到ctrl+z時,程式強行退出。

#include #include 

#include

#include

#include

using

namespace

std;

intg_sigid;

void handle_sigint(int

)int

main()

sleep(1);

}int j = 1000

;

while

(j)

return0;

}

輸出結果:

[root@localhost test]# ./a.out

i=1i=2

i=3i=4

^c[singal]: catched ctrl+c

i=5j=1000

j=1001

j=1002

^c[singal]: catched ctrl+c

j=1003

j=1004^z[

3]+ stopped ./a.out

3,帶有signal處理函式的while例子

這個例子跟第2個例子的區別是:在兩個while迴圈體內都設定了阻止條件,

所以在列印第1個while迴圈體的內容時,

如果此時遇到ctrl+c,第1個while迴圈體會退出,

然後執行第2個迴圈體,而第2個迴圈體的阻止條件同樣成立,所以程式退出了第2個迴圈體,

最後再順序執行後續**。

#include #include 

#include

#include

#include

using

namespace

std;

intg_sigid;

void handle_sigint(int

)int

main()

int j = 1000

;

while

(j)

printf(""

);

return0;

}

[root@localhost test]# ./a.out

i=1i=2

i=3^c[singal]: catched ctrl+c

i=4j=1000

Linux 訊號及其使用簡單講解

在學習訊號之前,我們先要知道,訊號與訊號量不是同乙個東西。訊號量主要是實現程序之間的同步與互斥,主要用於程序間通訊。這就是乙個訊號,現實生活中訊號也特別常見。訊號的作用 我們先想一下在現實生活中訊號主要是通知一件事情的,其實在作業系統中,訊號也扮演著這樣的角色。在作業系統中,通知乙個程序發生某乙個事...

Linux下的訊號

訊號是作業系統發給程序的一種資訊,程序會針對接收到的資訊做出相應的處理。前面談到乙個概念,叫做訊號量,這裡所說的訊號量和我們今天談到的訊號,除了名字相似,事實上並沒有任何聯絡,是兩個完全不相關的概念,故不可混為一談。訊號是如何產生的呢?先來說說熟悉的場景 使用者輸入命令,在前台啟動乙個程序,然後按下...

Linux下的訊號(二) 阻塞訊號

1,在此之前,必須先了解幾個概念 訊號遞達 delivery 實際執行訊號處理的動作。訊號未決 pending 訊號從產生到遞達之間的狀態。訊號阻塞 block 被阻塞的訊號產生時將保持在未決狀態,直到 程序解除對此訊號的阻塞,才 執行遞達的動作。注意 訊號阻塞和訊號忽略是不同的。只要訊號被阻塞就不...