各位看官們,大家好,上一回中咱們說的是進程間通信的例子,這一回咱們接著上一回的內容,繼續說該例子。閒話休提,言歸正轉。讓我們一起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 //子進程運行結束
各位看官,關於使用信號進行進程間通信的例子咱們就說到這裡。欲知後面還有什麼例子,且聽下回分解 。