Linux信號機制之信號的發送及接收

     Linux下的信號應用並不複雜,最多隻要以下3個步驟即可:
     1.安裝信號,通常採用sigaction(……)函數,此函數有3個參數,支持信號傳遞信息,主要用來與sigqueue()配合使用。sigaction()函數既支持實時信號的安裝同樣也支持非實時信號的安裝。
     2.實現三參數信號處理函數mysig_handler(int signal,struct siginfo *pInfo,void *)
     3.用sigqueue()發送信號
     對於需要發送信號的程序來說,只需實現上述1、3即可,而對於需要接收信號的程序只需實現1、2。信號發送和接收的操作具體可以參考以下兩個例子:
/*********************************************************************************
*
*信號發送示例
*
*********************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>

#define SEND_SIG SIGRTMIN+10
int main(int argc,char **argv)
{
     pid_t recv_pid;
     union sigval mysigval; //信號附加信息
    
     if(argc<2){
         printf("usage:%s <PID>/n",argv[0]);
         exit(1);
     }
     recv_pid=(pid_t)atoi(argv[1]);
     mysigval.sival_int=1983;     //此處都1983這個值沒有實際意思,純粹爲了測試
    
        //向某一進程循環發送信號
     while(1){
         if(sigqueue(recv_pid,SEND_SIG,mysigval)==-1){
             perror("send signal error!");
             exit(1);
         }
         printf("Send signal(%d) to PID(%d),argv(int)=%d/n/n",SEND_SIG,recv_pid,mysigval.sival_int);
         sleep(2);
     }
        
     exit(0);
}
/*********************************************************************************
*
*信號接收示例
*
*********************************************************************************/   

#include <unistd.h> //sleep(...)
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>

#define MY_SIG SIGRTMIN+10
#define isARG 0 //0---不接收附加信息
                 //1---接收附加信息

/*無附加信息的信號處理例程*/
void sig_handler(int signum)
{
     static int i=0;

     i++;
     printf(">%d ----capture signal : %d !/n",i,signum);
     //接收10次信號後結束進程
     if(i==10)
         exit(0);
}

/*帶附加信息的信號處理例程*/
void sig_handler_with_arg(int sig,siginfo_t *sig_info,void *unused)
{
     printf(">Capture signal : %d !/n",sig);
     printf(">Signal info : %d/n/n",sig_info->si_int);
}

int main(int argc,char **argv)
{
     struct sigaction sig_act;
     pid_t my_pid;

     my_pid=getpid();
     sigemptyset(&sig_act.sa_mask);
#if isARG //帶附加信息處理
     sig_act.sa_sigaction=sig_handler_with_arg;
     sig_act.sa_flags=SA_SIGINFO;
#else        //不帶附加信息處理
     sig_act.sa_handler=sig_handler;
     sig_act.sa_flags=0;
#endif    
         //安裝信號
     sigaction(MY_SIG,&sig_act,NULL);
     while(1){
         printf("[%d]wait for the sigal/n/n",my_pid);
         sleep(1);
     }

     exit(0);
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章