2014-01-14 67 views
1

我有下面的代碼片段:爲什麼提升asio信號處理程序立即取消?

#include <signal.h> 
#include <boost/asio.hpp> 
#include <iostream> 

void startAsyncWaitForSignal(boost::asio::io_service& ioService) 
{ 
    boost::asio::signal_set signals{ioService}; 
    signals.add(SIGTERM); 
    signals.async_wait(
     [&ioService](boost::system::error_code errorCode, int signalNumber) 
     { 
      std::cerr << errorCode.message() << std::endl; 
      if (!errorCode) { 
       std::cerr << "received signal " << signalNumber << std::endl; 
       startAsyncWaitForSignal(ioService); 
      } 
     } 
    ); 
} 

int main() { 
    boost::asio::io_service ioService; 
    startAsyncWaitForSignal(ioService); 
    ioService.run(); 
} 

我期望這個程序等待,直到第一個SIGTERM的到來,然後等待下一個,然後再下一個,...

但是該程序立即終止與下面的輸出:

Operation canceled 

這是什麼即時操作的取消原因是什麼?我試圖創建一個io_service :: work對象,但這只是改變了ioService.run()未完成的事實,但signal_set仍然立即取消。

我正在使用boost 1.54。有一個bug fix related to asio/signals in 1.55,但看起來像一個不同的問題。

+3

當離開'startAsyncWaitForSignal()'地方'signal_set'變量被破壞,'async_wait'呼叫被取消。 'signal_set'需要活得更長一點... –

+0

如果你將此作爲答案,我會接受這個。非常感謝! –

回答

4

當離開startAsyncWaitForSignal()時,本地signal_set變量被破壞,async_wait()呼叫被取消。 signal_set需要活得更長一點。移動出來的startAsyncWaitForSignal()它作爲參數傳遞,例如:

#include <signal.h> 
#include <boost/asio.hpp> 
#include <iostream> 

void startAsyncWaitForSignal(boost::asio::io_service& ioService, boost::asio::signal_set& signals) 
{ 
    signals.async_wait(
     [&ioService, &signals](boost::system::error_code errorCode, int signalNumber) 
     { 
      std::cerr << errorCode.message() << std::endl; 
      if (!errorCode) { 
       std::cerr << "received signal " << signalNumber << std::endl; 
       startAsyncWaitForSignal(ioService, signals); 
      } 
     } 
    ); 
} 

int main() { 
    boost::asio::io_service ioService; 
    boost::asio::signal_set signals{ioService}; 
    signals.add(SIGTERM); 
    startAsyncWaitForSignal(ioService, signals); 
    ioService.run(); 
} 
+1

不錯,但「只是更長一點」是一個毫無意義的測量? – NoSenseEtAl

+0

'signal_set'需要保留在'async_wait'調用的整個持續時間的範圍內。 –

+0

@SamMiller我認爲這不是100%正確表達(我知道你知道你的意思!)。在原始代碼示例中,'signal_set'的作用域就是:'async_wait'的整個持續時間。但範圍需要更廣泛:只要等待處理程序尚未被調用。 –

相關問題