diff --git a/util/proc.cpp b/util/proc.cpp index db004d0d..b5257065 100644 --- a/util/proc.cpp +++ b/util/proc.cpp @@ -19,9 +19,16 @@ void Util::Procs::childsig_handler(int signum){ if (signum != SIGCHLD){return;} pid_t ret = wait(0); #if DEBUG >= 1 - std::cerr << "Process " << plist[ret] << " terminated." << std::endl; + std::string pname = plist[ret]; #endif plist.erase(ret); + #if DEBUG >= 1 + if (isActive(pname)){ + std::cerr << "Process " << pname << " half-terminated." << std::endl; + }else{ + std::cerr << "Process " << pname << " fully terminated." << std::endl; + } + #endif } /// Attempts to run the command cmd. @@ -99,53 +106,66 @@ pid_t Util::Procs::Start(std::string name, std::string cmd, std::string cmd2){ sigaction(SIGCHLD, &new_action, NULL); handler_set = true; } + int pfildes[2]; + if (pipe(pfildes) == -1){ + #if DEBUG >= 1 + std::cerr << "Process " << name << " could not be started. Pipe creation failed." << std::endl; + #endif + return 0; + } + pid_t ret = fork(); if (ret == 0){ - int pfildes[2]; - if (pipe(pfildes) == -1){ - #if DEBUG >= 1 - std::cerr << "Process " << name << " could not be started. Pipe creation failed." << std::endl; - #endif - _exit(41); - } - pid_t pid; - if ((pid = fork()) == -1){ - #if DEBUG >= 1 - std::cerr << "Process " << name << " could not be started. Second fork() failed." << std::endl; - #endif - _exit(41); - }else if (pid == 0){ - close(pfildes[0]); - dup2(pfildes[1],1); - close(pfildes[1]); - runCmd(cmd); - }else{ - close(pfildes[1]); - dup2(pfildes[0],0); - close(pfildes[0]); - runCmd(cmd2); - } + close(pfildes[0]); + dup2(pfildes[1],1); + close(pfildes[1]); + runCmd(cmd); }else{ if (ret > 0){ - #if DEBUG >= 1 - std::cerr << "Process " << name << " started, PID " << ret << ": " << cmd << " | " << cmd2 << std::endl; - #endif plist.insert(std::pair(ret, name)); }else{ #if DEBUG >= 1 std::cerr << "Process " << name << " could not be started. fork() failed." << std::endl; #endif + close(pfildes[1]); + close(pfildes[0]); return 0; } } + + pid_t ret2 = fork(); + if (ret2 == 0){ + close(pfildes[1]); + dup2(pfildes[0],0); + close(pfildes[0]); + runCmd(cmd2); + }else{ + if (ret2 > 0){ + #if DEBUG >= 1 + std::cerr << "Process " << name << " started, PIDs (" << ret << ", " << ret2 << "): " << cmd << " | " << cmd2 << std::endl; + #endif + plist.insert(std::pair(ret2, name)); + }else{ + #if DEBUG >= 1 + std::cerr << "Process " << name << " could not be started. fork() failed." << std::endl; + #endif + Stop(name); + close(pfildes[1]); + close(pfildes[0]); + return 0; + } + } + close(pfildes[1]); + close(pfildes[0]); return ret; } /// Stops the named process, if running. /// \arg name (Internal) name of process to stop void Util::Procs::Stop(std::string name){ - if (!isActive(name)){return;} - Stop(getPid(name)); + while (isActive(name)){ + Stop(getPid(name)); + } } /// Stops the process with this pid, if running.