奇怪的sigwait()行为并理解阻塞和解除阻塞信号

时间:2016-03-19 12:38:52

标签: c++ signals

考虑下一段代码:

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>

0 个答案:

没有答案