2017-09-07 6 views
1

하는 Asio가 Signal_init.hpp에 SIGPIPE를 무시하는 코드가, 그러나 매크로 워프 그것을 io_service.hpp에있다 t라고 불렀다.asio는 SIGPIPE를 어떻게 처리합니까? '나는 매크로를 사용할 수 없습니다 발견 우분투에서 컴파일</p> <pre><code>#elif defined(__sun) || defined(__QNX__) || defined(__hpux) || defined(_AIX) || defined(__osf__) </code></pre> <p>그래서 <code>std::signal(Signal, SIG_IGN);</code> 안식처 :

그러나 닫힌 소켓에 asio로 쓸 때 complete 처리기에서 boost :: system :: error_code로 EPIPE 오류를보고 할 수 있습니다. libc doc에 따르면 :

이 경우 send는 먼저 SIGPIPE 신호를 생성합니다. 해당 신호가 무시되거나 차단되거나 해당 처리기가 반환되면 EPIPE와 함께 실패합니다.

어떻게 SIGPIPE로 설정하면 프로세스가 무시하게할까요? asio는 이것에 특별한 것을합니까?

답변

0

OS를 알려주고 싶으면 SIGPIPE을 무시하십시오. (?)

하는 Asio는 http://www.boost.org/doc/libs/1_65_1/boost/asio/detail/signal_init.hpp

이상하게도 그것이 단지 구식 UNIX에 포함되어 여기에 있다고 할 수있는 코드가 있습니다

#if defined(BOOST_ASIO_WINDOWS) || defined(__CYGWIN__) 
# include <boost/asio/detail/winsock_init.hpp> 
#elif defined(__sun) || defined(__QNX__) || defined(__hpux) || defined(_AIX) \ 
    || defined(__osf__) 
# include <boost/asio/detail/signal_init.hpp> 
#endif 

당신은 간단하게이 작업을 수행 할 수 있습니다 자신 :

#include <csignal> 

// ... 
std::signal(SIGPIPE, SIG_IGN); 

또는 Asio 신호 세트 클래스를 사용할 수 있습니다.

#include <boost/asio.hpp> 
#include <boost/asio/signal_set.hpp> 
#include <iostream> 

boost::asio::io_service svc; 
boost::asio::signal_set ss(svc); 

static void ignore_signal(boost::system::error_code ec, int /*signal*/) { 
    if (!ec) ss.async_wait(ignore_signal); 
    // 

표준 : COUT < < "\ n"< < ec.message() < < "\ n을"; }

int main() { 
    ss.add(SIGPIPE); 
    ss.add(SIGINT); 
    ss.async_wait(ignore_signal); 
    svc.run(); 
} 
+0

나는 그걸 어떻게 다루는 지 궁금 하네. 그것은 SIGPIPE를 무시하지 않고 MSG_NOSIGNAL을 사용하지 않습니다. 그러나 연결이 끊긴 소켓에 쓰기를 계속하면 SIGPIPE가 전혀 없습니다! – jean