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;
}
,因爲我需要學習儘可能多的關於線程的方式發送/我將在線程中使用它們阻塞。
嗯,謝謝你的答案。不知道我懂得如何使用struct sigaction來執行處理程序? – user460880
它有一個指針,你需要:)功能,一切 – arnaud576875
最重要的是......如果指針是'SIG_DFL',試圖調用它通常會導致非常接近的信號的默認操作的東西。 :-) –