我是靠谱客的博主 执着香水,最近开发中收集的这篇文章主要介绍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);
}

 

最后

以上就是执着香水为你收集整理的Linux信号机制之信号的发送及接收的全部内容,希望文章能够帮你解决Linux信号机制之信号的发送及接收所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(63)

评论列表共有 0 条评论

立即
投稿
返回
顶部