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);
}

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值