Linux c 信号—sigaction、sigqueue

思考:信号中断函数调用中是否被其他信号中断.

信号函数调用中只屏蔽本身信号,不屏蔽其他信号.(屏蔽了本身信号,信号排队,处理函数处理结束后,立即再次处理该信号调用处理函数。其他信号则直接可以中断处理函数。)

怎么保证信号处理函数调用中屏蔽指定信号呢?

sigaction可以指定处理函数调用的屏蔽信号

sigaction在处理信号的时候,接收数据

sigqueue发送信号的时候,可以发送数据

sigaction/sigqueue是signal/kill的增强版本

函数说明:

使用sigaction/sigqueue有两个理由.

稳定

增强功能

intsigaction(

intsig,//被处理信号

conststruct sigaction*action,//处理函数及其参数

structsigaction*oldact//返回原来的处理函数结构体

)

返回:

0:成功

-1:失败

structsigaction

{

void(*sa_handle)(int);

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

sigset_t*mask;//屏蔽信号

intflags;//SA_SIGINFO(使用第二个函数)

void**//保留成员.

}

例子:

#include<stdio.h>

#include<unistd.h>

#include<signal.h>

voidhandle(int s)

{

printf(“信号处理函数正在处理!\n”);

sleep(5);

printf(“信号处理函数处理结束!\n”);

}

voidmain()

{

structsigaction act={0};

act.sa_handle=handle;

sigemptyset(&act.mask);

sigaddset(&act.mask,SIGINT);//信号处理函数屏蔽SIGINT信号

act.flags=0;

sigaction(SIGUSR1,&act,0);

while(1);

}

说明:

当程序运行,并向程序发送了SIGUER信号,程序调用信号处理函数时,我们按下ctrl+c向程序发送SIGINT信号,处理函数不会中断。(处理函数屏蔽了SIGINT信号),当处理函数结束后,程序会立即处理SIGINT信号。

sigqueue函数:

#include<signal.h>

int sigqueue(pid_t pid,

int sig,

const union sigval value//发送信号时发送的数据);

union sigval {

intsival_int;

void * sival_ptr;

};

例子2:sigqueue发送信号并传递数据

//接收信号:

#include<stdio.h>

#include<unistd.h>

#include<signal.h>

void handle(int s,siginfo_t siginfo,void *) //第二个参数是个结构体,该结构体中的成员//si_int存放了传递的int数据,si_ptr 存放了传//递的void*数据.

{

printf(“信号处理函数正在处理!%d\n”,siginfo->si_int);

sleep(5);

printf(“信号处理函数处理结束!\n”);

}

voidmain()

{

structsigaction act={0};

act.sa_sigaction=handle; //要传递数据,要用结构的第二个函数指针

sigemptyset(&act.mask);

sigaddset(&act.mask,SIGINT);//信号处理函数屏蔽SIGINT信号

act.flags=SA_SIGINFO;

sigaction(SIGUER1,&act,0);

while(1);

}

//信号发送

#include<unistd.h>

#include<signal.h>

voidmain()

{

union sigval val;

val.sival_int=9999; //设置传递的数据

sigqueue(pid,SIGUSR1,val);//pid代替上个程序的进程号

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值