rx_arping handle sigchld (#691)

* rx_arping pclose gave -1 due to sigchld being ignored, fixed with sig handler doing a wait
This commit is contained in:
Dhanya Thattil 2023-03-16 11:57:30 +01:00 committed by GitHub
parent 532f76ed4f
commit bc46d0f6ab
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 14 additions and 7 deletions

View File

@ -30,6 +30,7 @@ This document describes the differences between v7.x.x and v7.0.0
- moench being made compatible with jungfrau 2.0 boards (jungfrau structure, away from ctb) - moench being made compatible with jungfrau 2.0 boards (jungfrau structure, away from ctb)
- eiger febl and feb in versions - eiger febl and feb in versions
- fixed rx_arping error
- fix hdf5 compilation (detspec fields) - fix hdf5 compilation (detspec fields)

View File

@ -7,6 +7,7 @@
#include <signal.h> #include <signal.h>
#include <thread> #include <thread>
#include <unistd.h> #include <unistd.h>
#include<sys/wait.h>
namespace sls { namespace sls {
@ -16,6 +17,10 @@ namespace sls {
#define gettid() syscall(SYS_gettid) #define gettid() syscall(SYS_gettid)
#endif #endif
void func(int signum) {
wait(NULL);
}
Arping::Arping() {} Arping::Arping() {}
Arping::~Arping() { Arping::~Arping() {
@ -44,10 +49,11 @@ pid_t Arping::GetProcessId() const { return childPid; }
bool Arping::IsRunning() const { return runningFlag; } bool Arping::IsRunning() const { return runningFlag; }
void Arping::StartProcess() { void Arping::StartProcess() {
TestCommands();
// to prevent zombies from child processes being killed // to prevent zombies from child processes being killed
signal(SIGCHLD, SIG_IGN); signal(SIGCHLD, func);
// test once to throw exception if arping failed
TestForErrors();
// Needs to be a fork and udp socket deleted after Listening threads // Needs to be a fork and udp socket deleted after Listening threads
// done running to prevent udp socket cannot bind because of popen // done running to prevent udp socket cannot bind because of popen
@ -90,7 +96,7 @@ void Arping::ProcessExecution() {
} }
} }
void Arping::TestCommands() { void Arping::TestForErrors() {
// atleast one interface must be set up // atleast one interface must be set up
if (commands[0].empty()) { if (commands[0].empty()) {
throw RuntimeError( throw RuntimeError(
@ -116,7 +122,7 @@ std::string Arping::ExecuteCommands() {
FILE *sysFile = popen(cmd.c_str(), "r"); FILE *sysFile = popen(cmd.c_str(), "r");
if (sysFile == NULL) { if (sysFile == NULL) {
std::ostringstream os; std::ostringstream os;
os << "Could not Arping [" << cmd << " ] : Popen fail"; os << "Could not Arping (" << cmd << " ) : Popen fail (" << strerror(errno) << ')';
return os.str(); return os.str();
} }
@ -128,7 +134,7 @@ std::string Arping::ExecuteCommands() {
// check exit status of command // check exit status of command
if (pclose(sysFile)) { if (pclose(sysFile)) {
std::ostringstream os; std::ostringstream os;
os << "Could not arping[" << cmd << "] : " << output; os << "Could not arping (" << cmd << ") : " << strerror(errno);
return os.str(); return os.str();
} else { } else {
LOG(logDEBUG) << output; LOG(logDEBUG) << output;

View File

@ -28,7 +28,7 @@ class Arping {
void StopProcess(); void StopProcess();
private: private:
void TestCommands(); void TestForErrors();
std::string ExecuteCommands(); std::string ExecuteCommands();
void ProcessExecution(); void ProcessExecution();