2011-08-26 61 views
1

我正在實現一個簡單的定時器,它在到期時引發一個RT信號。我想要做的是註冊一個信號處理程序(使用sigaction),當信號發生時被調用。同時主代碼等待,直到使用sigwaitinfo調用信號。是否可以使用自定義的sigaction信號處理程序和pthread_sigmask?

實現信號處理程序或sigwaitinfo獨家正常工作。但是,當兩者都使用時,信號處理程序永遠不會被調用。我嘗試切換順序;即在阻止信號之前註冊處理程序。沒有區別。

這裏是我這樣做主要是用於教育目的的代碼

// gcc -Wall -o sigwait_example sigwait_example.c -lrt 
#include <stdlib.h> 
#include <unistd.h> 
#include <stdio.h> 
#include <signal.h> 
#include <time.h> 
#include <errno.h> 
#include <string.h> 

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

,因爲我需要學習儘可能多的關於線程的方式發送/我將在線程中使用它們阻塞。

回答

1

這是不可能的,因爲sigwaitinfo()從隊列中刪除信號。

你可以,但是,使用sigaction(SIG, NULL, &sa)檢索該信號的sigaction的結構和執行處理程序。

+0

嗯,謝謝你的答案。不知道我懂得如何使用struct sigaction來執行處理程序? – user460880

+0

它有一個指針,你需要:)功能,一切 – arnaud576875

+1

最重要的是......如果指針是'SIG_DFL',試圖調用它通常會導致非常接近的信號的默認操作的東西。 :-) –

相關問題