comm: ignore SIGPIPE

This prevents client and server from being sent a SIGPIPE (and
terminating) when the other side unexpectedly closes the connection.
It's way easier to handle this condition when checking the write()
return value, than to do anything smart in a SIGPIPE handler.  More
details:
<http://stackoverflow.com/questions/108183/how-to-prevent-sigpipes-or-handle-them-properly>

Change-Id: I1da5bf5ef79c8b7b00ede976e96ed4f1c560049d
This commit is contained in:
Horst Schirmeier
2013-04-25 16:21:59 +02:00
parent 091e8dcae0
commit 880e7a81ff
4 changed files with 16 additions and 0 deletions

View File

@ -1,10 +1,18 @@
#include <string>
#include <errno.h>
#include <signal.h>
#include "SocketComm.hpp"
namespace fail {
void SocketComm::init()
{
// It's usually much easier to handle the error on write(), than to do
// anything intelligent in a SIGPIPE handler.
signal(SIGPIPE, SIG_IGN);
}
bool SocketComm::sendMsg(int sockfd, google::protobuf::Message& msg)
{
#ifdef USE_SIZE_PREFIX

View File

@ -21,6 +21,10 @@ namespace fail {
class SocketComm {
public:
/**
* This allows us to ignore SIGPIPE.
*/
static void init();
/**
* Send Protobuf-generated message
* @param sockfd open socket descriptor to write to

View File

@ -7,6 +7,7 @@
#include "util/SynchronizedMap.hpp"
#include "config/FailConfig.hpp"
#include "comm/FailControlMessage.pb.h"
#include "comm/SocketComm.hpp"
#include <list>
#include <ctime>
@ -81,6 +82,7 @@ public:
JobServer(int port = SERVER_COMM_TCP_PORT) : m_port(port), m_finish(false), m_noMoreExps(false),
m_maxThreads(128), m_threadtimeout(0), m_undoneJobs(SERVER_OUT_QUEUE_SIZE)
{
SocketComm::init();
m_runid = std::time(0);
#ifndef __puma
m_serverThread = new boost::thread(&JobServer::run, this); // run operator()() in a thread.

View File

@ -1,4 +1,5 @@
#include "JobClient.hpp"
#include "comm/SocketComm.hpp"
using namespace std;
@ -6,6 +7,7 @@ namespace fail {
JobClient::JobClient(const std::string& server, int port)
{
SocketComm::init();
m_server_port = port;
m_server = server;
m_server_ent = gethostbyname(m_server.c_str());