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:
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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.
|
||||
|
||||
@ -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());
|
||||
|
||||
Reference in New Issue
Block a user