程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 一起talk C栗子吧(第八十六回:C語言實例--使用信號進行進程間通信三)

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

編輯:關於C語言

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



各位看官們,大家好,上一回中咱們說的是進程間通信的例子,這一回咱們接著上一回的內容,繼續說該例子。閒話休提,言歸正轉。讓我們一起talk C栗子吧!

看官們,我們在上一回中說到了signal函數的缺點,從而引出了sigaction函數,它比signal函數要健壯一些,接下來我們介紹它的用法。

sigaction函數的和signal函數的作用類似:用來配置信號處理函數。不過,他的配置性要強大很多。

下面是sigaction的函數原型

int sigaction(int sig,const struct sigaction *act,struct sigaction *oact)

大家看到這個函數是不覺得有些復雜了呢,不用擔心,我們慢慢分析它:

它有三個參數

第一個參數sig表示需要配置的信號; 第二個參數表示對信號的詳細配置國; 第三個參數用來存放信號被配置以前的動作,如果沒有這個需要,可以為空。 該函數運行成功時返回0,失敗時返回-1.

該函數中最後兩個 參數是struct sigaction類型的指針,下面是該結構體的定義,以及每個成員的作用:

struct sigaction
{
void (*sa_handler)(int);   //信號處理函數,和signal函數中的func對應
sigset_t sa_mask;          //信號集,參數sig代表的信號會加入到該信號集中
int sa_flags;              //表示對信號的處理方式,通常為0
void (*sa_sigaction)(int,siginfo_t *,void *);  //和第一個成員作用類似,當sa_flags為SA_SIGINFO時,
                                               //使用該函數處理信號,而不使用sa_handler指向的函數處理信號
};

大家從上面的結構體定義中可以看到對信號的配置和處理都放到了sigaction的第二個參數act中,所以
我們可以修改參數act的值,來滿足對信號配置的要求。

接下來,我們通過具體的代碼來說明它們的用法

#include
#include
#include

// signal process function
void sig_receive(int signo)
{
    printf("received signal :%d \n",signo);
    printf("signalprocessing in :%d \n",getpid());
    // do something for signal
}

int main()
{
    pid_t pid;
    int pid_res;
    int stat_value;
    struct sigaction act;

    act.sa_handler = sig_receive;  //config the signal processing function
    sigemptyset(&act.sa_mask);     //config the signal set,and it will be setted as empty
    act.sa_flags = 0;              // do need to give a value to it

    sigaction(SIGALRM,&act,NULL); //config signal by sigaciton function, the third param is NULL

    pid = fork();

    if(pid > 0)
    {
        printf("PID: %d -> Father Process send signal\n",getpid());
        kill(pid,SIGALRM); //send signal
    }
    else if(pid == 0)
    {
        printf("PID: %d -> Son Process receive signal \n",getpid());
    }
    else
    {
        printf("Create process failed \n");
        return 1;
    }

    pid_res = wait(&stat_value);

    if(pid_res > 0)
    {
        printf("Son process finished: PID = %d \n",pid_res);
    }

    return 0;
}

從上面的代碼中,我們可以看到:首先配置sigaction的參數,具體的操作如下:

給信號配置信號處理函數; 接著設置信號集; 最後通過sigaction函數配置信號處理函數。

大家可以和前一章回中的內容進行對比,我們使用sigaction函數取代了signal函數,該函數可以把信號放到進程的信號集中,阻塞起來,直到信號處理函數准備好時,再讓進程接收信號。這樣可以避免信號處理函數還沒有被調用就收到了信號。

看官們,正文中就不寫代碼了,詳細的代碼放到了我的資源中,大家可以點擊這裡下載使用。

下面是程序的運行結果,請大家參考

PID: 4468 -> Father Process send signal     //父進程發送信號
received signal :14                         //信號處理函數在處理信號
signalprocessing in :4469                   //信號處理函數在處理信號
PID: 4469 -> Son Process receive signal  
Son process finished: PID = 4469            //子進程運行結束

各位看官,關於使用信號進行進程間通信的例子咱們就說到這裡。欲知後面還有什麼例子,且聽下回分解 。



  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved