C_Linux编程_信号_4、信号的处理流程sigaction&sigqueue函数的使用

首先推荐一个学Linux信息机制的博客:

https://www.cnblogs.com/hoys/archive/2012/08/19/2646377.html

强的很,通俗易懂。

 

可以说sigaction是signal函数的加强版,sigqueue是kill函数的加强版

实例一:信号发送及处理

实现一个信号接收程序sigreceive(其中信号安装由sigaction())

在原有的基础上添加了备注,应该可以看懂。

 

#include <stdio.h>
#include <stdlib.h>
#include <signal.h>

#include <sys/types.h>

#include <unistd.h>

void new_op(int,siginfo_t*,void*);

main(int argc, char const *argv[])

{
        struct sigaction act;  //sigaction描述信号到达时的操作
        int sig;

        //sig=atoi(argv[1]);//atoi是把字符串转换成整型数的一个函数  
        sig=3;
        sigemptyset(&act.sa_mask);//清空了信号集

        act.sa_flags=SA_SIGINFO;//SA_SIGINFO 调用信号捕获函数

        act.sa_sigaction=new_op;// new_op 指定的处理函数

        if(sigaction(sig,&act,NULL) < 0)

        {

                printf("install sigal error\n");

        }

       

        while(1)

        {

                sleep(2);

                printf("wait for the signal\n");

        }

}

 
/*

由_sa_sigaction是指定的信号处理函数带有三个参数,
是为实时信号而设的(当然同样支持非实时信号),它指定一个3参数信号处理函数。
第一个参数为信号值

*/
void new_op(int signum,siginfo_t *info,void *myact)

{

        printf("receive signal %d", signum);

        sleep(5);

}

实例二:信号传递附加信息(利用sigqueue函数)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <signal.h>
#include <sys/types.h>
#include <unistd.h>


void new_op(int signum,siginfo_t *info,void *myact)//三参数信号处理函数的实现

{

        int i;

        for(i=0;i<10;i++)

        {

                printf("%c\n ",(*( (char*)((*info).si_ptr)+i)));

        }

        printf("handle signal %d over;",signum);

}


main(int argc,char**argv)

{

        struct sigaction act;  
        union sigval mysigval;
        int i;
        int sig;
        pid_t pid;         

        char data[10];
/*
void *memset(void *str, int c, size_t n);
复制字符 c(一个无符号字符)到参数 str 所指向的字符串的前 n 个字符

*/
        memset(data,0,sizeof(data));//在data里填入0字符,也就是空

        for(i=0;i < 5;i++)

                data[i]='2';//data前五个填入2字符

        mysigval.sival_ptr=data;//附加信息,要传进信号处理函数

        //sig=atoi(argv[1]);
        sig=3;

        pid=getpid();//获取当前进程号

        sigemptyset(&act.sa_mask);//清空信号集

        act.sa_sigaction=new_op;//三参数信号处理函数

        act.sa_flags=SA_SIGINFO;//信息传递开关,允许传说参数信息给new_op

        if(sigaction(sig,&act,NULL) < 0)

        {

                printf("install sigal error\n");

        }

        while(1)

        {

                sleep(2);

                printf("wait for the signal\n");
/*
在调用sigqueue时,sigval_t指定的信息会拷贝到
对应sig 注册的3参数信号处理函数的siginfo_t结构中,这样信号处理函数就可以处理这些信息了。
由于sigqueue系统调用支持发送带参数信号,所以比kill()系统调用的功能要灵活和强大得多
*/
                sigqueue(pid,sig,mysigval);//向本进程发送信号,并传递附加信息

        }

}

 

 

 

 

 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值