一起talk C栗子吧(第八十四回:C語言實例--使用信號進行進程間通信一)
阿新 • • 發佈:2017-07-23
split article 語言 方法 pin 第一個 ping num ont
各位看官們,大家好,上一回中咱們說的是進程間通信的樣例。這一回咱們說的樣例是:使用信號進行進程間通信。閑話休提,言歸正轉。
讓我們一起talk C栗子吧!
我們在上一回中提到過進程之間通信須要解決的三個問題,時間不長。我想大家都記得。今天我們就來解決第一個問題:進程之間怎樣進行通信。
信號的概念
在解決這個問題前。我們先介紹一下信號。信號是Unix/Linux系統提供的一種機制,它本質上一種軟件中斷。
信號為我們提供了一種異步的事件處理方法。當進程收到信號時就會採取某種操作。比如,當進程收到終止信號(SIGKILL)時就會終止進程。這點我們在介紹進程結束時做過相關的說明。
系統為信號定義了名字,我們能夠通過名字來使用信號,信號名字是以SIG開頭的字符串。比方。SIGKILL,SIGINT等。
信號的產生
要使用信號進行進程間的通信,首先須要產生信號,信號能夠通過以下幾種方式來產生:
- 1.用戶使用終端按鍵時發出信號。
比方按下ctrl+c會發出中斷信號:SIGINT;
- 2.硬件有異常時會發出信號。比方使用無效的內存;
- 3.軟件符合某種條件時會發出信號。比方鬧鐘時鐘超時後會發出SIGALRM信號。
- 4.使用kill命令主動發送信號;
信號的處理
進程收到信號後會做對應的處理,詳細有以下幾種處理方式:
- 1.忽略信號。該處理方式就是收到信號後什麽也不做,自己總在歇息;
- 2.執行系統對信號定義的默認動作。
該處理方式就是收到信號後把它交給系統去處理,自己在一邊歇息;
- 3.捕捉信號。這樣的處理方式就是收到信號後做一些相關的處理,至於做什麽處理,須要用戶去實現。
明確信號的這些知識後,我們就正式開始介紹使用信號這樣的方式進行通信。
我們舉一個簡單的樣例進行說明。
編譯以下的程序而且執行:
int main
{
int i = 0;
while(i++ < 9999)
{
printf("i have been sleeping for %d second \n",i);
sleep(1);
}
return 0;
}
以下是程序的執行結果。請大家參考:
./s //在終端中執行編譯後的程序
i have been sleeping for 1 second //程序在執行,而且輸出執行結果
i have been sleeping for 2 second
i have been sleeping for 3 second
i have been sleeping for 4 second
i have been sleeping for 5 second
i have been sleeping for 6 second
i have been sleeping for 7 second
i have been sleeping for 8 second
i have been sleeping for 9 second
i have been sleeping for 10 second
^C //在終端中按下ctrl+c終止程序執行
通過上面的程序, 我們分析一下程序中進程通信的原理:
- 把在終端中執行的程序當作進行A,終端本身當作進程B。
- 在進行B中通過按鍵給進程 A發送SIGINT信號。
- 進程B收到該信號後做出了響應:停止執行。我們在進程B中能夠看到進程A停止了執行。
看官們。我們後面的章回中還會舉其他進程之間通信的樣例,以便讓大家對使用信號進行進程之間通信有更加深入的了解。
各位看官。關於使用信號進行進程間通信的樣例咱們就講到這裏。欲知後面還有什麽樣例,且聽下回分解 。
一起talk C栗子吧(第八十四回:C語言實例--使用信號進行進程間通信一)