考虑下一段代码:
chain
我的主要目标是能够运行功能,在运行期间 - // Sigaction and timers
struct sigaction sa;
sigset_t maskSet, pendingSet;
/**
* Blocks the SIG_SETMASK in maskSet.
* @return None.
*/
static void block_signal(void)
{
// ~~~Blocking signal~~~
if(sigemptyset(&pendingSet) == -1)
{
ErrorHandler::sysCallError(THREAD_SYS_CALL_ERROR_SIGNAL_HANDLE);
}
if(sigpending(&pendingSet) == -1)
{
ErrorHandler::sysCallError(THREAD_SYS_CALL_ERROR_SIGNAL_HANDLE);
}
if(sigprocmask(SIG_BLOCK, &maskSet, NULL) == -1)
{
killProcessAfterMemoryAllocs();
}
}
/**
* Unblocks the SIG_SETMASK in maskSet.
* @return None.
*/
static void unblock_signal(void)
{
// ~~~Blocking signal~~~
int result;
int sig;
// If we got a signal while performing operation that require signal block.
if(sigismember(&pendingSet, SIGVTALRM) != -1)
{
result = sigwait(&pendingSet, &sig);
// DOESNT REACH HERE
if(result == 0)
{
printf("sigwait() returned for signal %d\n", sig);
//Do stuff
}
}
if (sigprocmask(SIG_UNBLOCK, &maskSet, NULL) == -1)
{
killProcessAfterMemoryAllocs();
}
}
,由我定义的计时器引发的功能将被阻止。 (block_signal - > dosomthing SIGNALS被阻止 - > unblocksignal)。 Maskset使用SIGVTALARM
两个问题:
按照我实施的方式,SIGVTALARM
会导致程序进入无限循环。
没有sigwait() - 我使用一个虚拟计时器,它在每个定义的时间间隔内引发SIGVTALARM。 假设我阻止了SIGVTALARM。据我所知,当它被提升时(尽管被阻止) - 信号变为待定状态。一旦我解锁它,信号就会被信号处理者接收并处理。 我不明白的是,随着NEXT信号的提出,这是怎么回事。在PREVIOUS信号释放后,下一个信号是否会在一段规定的时间间隔内上升,或者从PREVIOUS信号上升(并且被阻止 - >成为待定)的那一刻起提升一段时间。
< / LI>