diff options
Diffstat (limited to 'mteval/ns_ext.cc')
| -rw-r--r-- | mteval/ns_ext.cc | 16 | 
1 files changed, 16 insertions, 0 deletions
| diff --git a/mteval/ns_ext.cc b/mteval/ns_ext.cc index 1e7e2bc1..9d2c75c6 100644 --- a/mteval/ns_ext.cc +++ b/mteval/ns_ext.cc @@ -4,6 +4,8 @@  #include <cstdlib>  #include <cstring>  #include <unistd.h> +#include <signal.h> +#include <sys/wait.h>  #include <sstream>  #include <iostream>  #include <cassert> @@ -13,6 +15,14 @@  using namespace std; +void metric_child_signal_handler(int signo) { +  int status = 0; +  cerr << "Received SIGCHLD(" << signo << ") ... aborting.\n"; +  // reap zombies +  while (waitpid(-1, &status, WNOHANG) > 0) {} +  abort(); +} +  struct NScoreServer {    NScoreServer(const std::string& cmd);    ~NScoreServer(); @@ -27,6 +37,12 @@ struct NScoreServer {  };  NScoreServer::NScoreServer(const string& cmd) { +  static bool need_init = true; +  if (need_init) { +    need_init = false; +    signal(SIGCHLD, metric_child_signal_handler); +  } +    cerr << "Invoking " << cmd << " ..." << endl;    if (pipe(p2c) < 0) { perror("pipe"); exit(1); }    if (pipe(c2p) < 0) { perror("pipe"); exit(1); } | 
