1. 程式人生 > >一起talk C栗子吧(第八十四回:C語言實例--使用信號進行進程間通信一)

一起talk C栗子吧(第八十四回:C語言實例--使用信號進行進程間通信一)

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語言實例--使用信號進行進程間通信一)