linux c 自定义 sigaction,是否可以使用自定义的sigaction信号处理程序和pthread_sigmask?...

我正在实现一个简单的定时器,它在到期时引发一个RT信号。我想要做的是注册一个信号处理程序(使用sigaction),当信号发生时被调用。同时主代码等待,直到使用sigwaitinfo调用信号。是否可以使用自定义的sigaction信号处理程序和pthread_sigmask?

实现信号处理程序或sigwaitinfo独家正常工作。但是,当两者都使用时,信号处理程序永远不会被调用。我尝试切换顺序;即在阻止信号之前注册处理程序。没有区别。

这里是我这样做主要是用于教育目的的代码

// gcc -Wall -o sigwait_example sigwait_example.c -lrt

#include

#include

#include

#include

#include

#include

#include

#define install_handler(sig,sa) if(sigaction(sig, &sa, NULL) == -1){ \

perror("sigaction"); }

#define SIG SIGRTMIN+1

volatile int flag=0;

void handler(int signum){

flag++;

}

int main(void){

struct itimerspec its;

sigset_t blocked;

siginfo_t si;

timer_t timerid;

struct sigevent evt;

struct sigaction sa;

evt.sigev_notify = SIGEV_SIGNAL;

evt.sigev_signo = SIG;

evt.sigev_value.sival_ptr = &timerid;

if (timer_create(CLOCK_REALTIME, &evt, &timerid)){

perror("timer_create");

}

//setup timer

its.it_value.tv_sec = 0;

its.it_value.tv_nsec = 0.1*1E9;

its.it_interval.tv_sec = 0;

its.it_interval.tv_nsec = 0;

//arm the timer

if (timer_settime(timerid, 0, &its, NULL))

perror("timer_settime");

sigemptyset(&blocked);

sigaddset(&blocked, SIG);

//add SIG to blocked signals

pthread_sigmask(SIG_BLOCK, &blocked, NULL);

sa.sa_flags = SA_SIGINFO; //use this flag to set custom handler

sa.sa_sigaction = handler;

sigemptyset(&sa.sa_mask);

install_handler(SIG,sa);

while (sigwaitinfo(&blocked, &si) == -1 && errno == EINTR);

printf("received signal: %s, flag=%d\n",strsignal(si.si_signo),flag);

//while(flag==0) sleep(1); //use this when only signal handler is used

timer_delete(timerid);

return 0;

}

,因为我需要学习尽可能多的关于线程的方式发送/我将在线程中使用它们阻塞。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值