我的信號SIGTERM和SIGINT的信號處理程序在接收到任一信號時會導致輪詢錯誤。我不確定它爲什麼這樣做,我想我不知道我錯過了一些sigaction的行爲。C++任何信號的輪詢錯誤
while(!signalHandler.gotExitSignal()) {
switch (poll(&ufds[0], NUM_FDS, POLL_TIMEOUT)) {
case -1: {
throw std::runtime_error("poll error (-1)"); /* ABORT */
}
.
.
我的signalHandler是一個包含sigaction處理的類。
struct sigaction killAction, termAction;
memset(&killAction, 0, sizeof(struct sigaction));
killAction.sa_handler = SignalHandler::ExitHandler;
sigemptyset(&killAction.sa_mask);
killAction.sa_flags = 0;
if(sigaction(SIGTERM, &killAction, NULL) < 0)
throw SignalException("sigaction failed for killAction");
memset(&termAction, 0, sizeof(struct sigaction));
termAction.sa_handler = SignalHandler::ExitHandler;
sigemptyset(&termAction.sa_mask);
termAction.sa_flags = 0;
if(sigaction(SIGTERM, &termAction, NULL) < 0)
throw SignalException("sigaction failed for termAction");
所以我的預期片斷循環的行爲,我給了應該是:(!signalHandler.gotExitSignal())
- 而{
- 開關(輪詢(&個UFD [0],NUM_FDS ,POLL_TIMEOUT)){
- 投票後做一些清理的東西
- 轉到1個
- 而(!signalHandler.gotExitSignal( )){
- INTERRUPT
- 開關(輪詢(&個UFD [0],NUM_FDS,POLL_TIMEOUT)){
- 做一些清理東西輪詢之後
- 轉到第1
- 分段環
什麼使用:
- while(!signalHandler.gotExitSignal()){
- 開關(輪詢(&個UFD [0],NUM_FDS,POLL_TIMEOUT)){
- 輪詢後做一些清理東西
- 轉到第1個
- 而(!signalHandler.gotExitSignal()){
- INTERRUPT
- throw std :: runtime_error(「poll error(-1)」);
我試過一個場景,輪詢開關後,我睡了2秒,然後終止程序 - 它優雅地退出循環條件。當我輪詢並接收信號時存在問題。我沒有使用SIGHUP信號,它用於告訴程序重新加載它的配置,但是我爲SIGHUP設置了一個信號來測試它,並且像我的其他信號一樣通過輪詢錯誤終止了我的程序。但是我不能讓我的程序在任何信號上崩潰,我想知道我是否忘記了一些東西。
由於信號可能已經中斷了對被調查的fds的任何操作,poll()應該用-1(這個開關在結果BTW上相當無用)和errno EINTR解救出來。與您的信號處理器定義無關。 –