Merge branch 'master' of octo.ddvtech.com:pls
This commit is contained in:
commit
266196d731
1 changed files with 50 additions and 30 deletions
|
@ -19,9 +19,16 @@ void Util::Procs::childsig_handler(int signum){
|
||||||
if (signum != SIGCHLD){return;}
|
if (signum != SIGCHLD){return;}
|
||||||
pid_t ret = wait(0);
|
pid_t ret = wait(0);
|
||||||
#if DEBUG >= 1
|
#if DEBUG >= 1
|
||||||
std::cerr << "Process " << plist[ret] << " terminated." << std::endl;
|
std::string pname = plist[ret];
|
||||||
#endif
|
#endif
|
||||||
plist.erase(ret);
|
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.
|
/// 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);
|
sigaction(SIGCHLD, &new_action, NULL);
|
||||||
handler_set = true;
|
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();
|
pid_t ret = fork();
|
||||||
if (ret == 0){
|
if (ret == 0){
|
||||||
int pfildes[2];
|
close(pfildes[0]);
|
||||||
if (pipe(pfildes) == -1){
|
dup2(pfildes[1],1);
|
||||||
#if DEBUG >= 1
|
close(pfildes[1]);
|
||||||
std::cerr << "Process " << name << " could not be started. Pipe creation failed." << std::endl;
|
runCmd(cmd);
|
||||||
#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);
|
|
||||||
}
|
|
||||||
}else{
|
}else{
|
||||||
if (ret > 0){
|
if (ret > 0){
|
||||||
#if DEBUG >= 1
|
|
||||||
std::cerr << "Process " << name << " started, PID " << ret << ": " << cmd << " | " << cmd2 << std::endl;
|
|
||||||
#endif
|
|
||||||
plist.insert(std::pair<pid_t, std::string>(ret, name));
|
plist.insert(std::pair<pid_t, std::string>(ret, name));
|
||||||
}else{
|
}else{
|
||||||
#if DEBUG >= 1
|
#if DEBUG >= 1
|
||||||
std::cerr << "Process " << name << " could not be started. fork() failed." << std::endl;
|
std::cerr << "Process " << name << " could not be started. fork() failed." << std::endl;
|
||||||
#endif
|
#endif
|
||||||
|
close(pfildes[1]);
|
||||||
|
close(pfildes[0]);
|
||||||
return 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<pid_t, std::string>(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;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Stops the named process, if running.
|
/// Stops the named process, if running.
|
||||||
/// \arg name (Internal) name of process to stop
|
/// \arg name (Internal) name of process to stop
|
||||||
void Util::Procs::Stop(std::string name){
|
void Util::Procs::Stop(std::string name){
|
||||||
if (!isActive(name)){return;}
|
while (isActive(name)){
|
||||||
Stop(getPid(name));
|
Stop(getPid(name));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Stops the process with this pid, if running.
|
/// Stops the process with this pid, if running.
|
||||||
|
|
Loading…
Add table
Reference in a new issue