#include "ProcessUtilities.h" #include #include #include #include #include class ProcessInfo { public: int PID; int StdOutput; int StdError; ProcessController* Master; bool cycleStandardOutput(); bool cycleStandardError(); void waitForFinish(); }; void ProcessInfo::waitForFinish() { int ret=0; waitpid(PID,&ret,0); if (WIFEXITED(ret)) { ret = WEXITSTATUS(ret); Master->finished(ret); for (unsigned int i=0; iPublic.size(); ++i) Master->Public[i]->processTerminated(Master,ret); } } bool ProcessInfo::cycleStandardOutput() { char Buffer[1025]; int res = read(StdOutput,Buffer,1024); if (res < 0) std::cout << "Read failed" << std::endl; else if (res == 0) { waitForFinish(); return true; } else Master->standardOutput(std::string(Buffer,res)); return false; } bool ProcessInfo::cycleStandardError() { char Buffer[1025]; int res = read(StdError,Buffer,1024); if (res < 0) std::cout << "Read failed" << std::endl; else if (res == 0) { } else Master->standardError(std::string(Buffer,res)); return false; } std::vector Processes; bool launchProcess(ProcessController* theController, const std::string& Executable, const std::vector& Args) { /* std::cout << "EXEC : " << Executable; for (unsigned int i=0; ifailed(); std::cerr << "Failed to create pipe stdout " << errno << std::endl; return false; } int tubeStandardError[2]; result = pipe(tubeStandardError); if (result < 0) { close(tubeStandardOutput[0]); close(tubeStandardOutput[1]); theController->failed(); std::cerr << "Failed to create pipe stderr " << errno << std::endl; return false; } pid_t pid = fork(); if (pid < 0) { close(tubeStandardOutput[0]); close(tubeStandardOutput[1]); close(tubeStandardError[0]); close(tubeStandardError[1]); theController->failed(); std::cerr << "Failed to fork" << std::endl; return false; } else if (pid) { // parent close(tubeStandardOutput[1]); close(tubeStandardError[1]); ProcessInfo PI; PI.Master = theController; PI.PID = pid; PI.StdOutput = tubeStandardOutput[0]; PI.StdError = tubeStandardError[0]; Processes.push_back(PI); return true; } else { // child close(tubeStandardOutput[0]); close(tubeStandardError[0]); int res = dup2(tubeStandardOutput[1],STDOUT_FILENO); if (res < 0) { std::cerr << "Failed to dup2 standard output" << std::endl; close(tubeStandardOutput[1]); close(tubeStandardError[1]); exit(1); } res = dup2(tubeStandardError[1],STDERR_FILENO); if (res < 0) { std::cerr << "Failed to dup2 standard error" << std::endl; close(tubeStandardOutput[1]); close(tubeStandardError[1]); exit(1); } char** args = (char**)malloc(sizeof(char*)*(Args.size()+2)); args[0] = (char*)malloc(sizeof(char)*Executable.length()+1); strcpy(args[0],Executable.c_str()); for (unsigned int i=0; i"); } bool shellLaunchProcess(ProcessController* theController, const std::string& Executable, const std::vector& Args) { unsigned int i=0; for (i=0; i NewArgs; NewArgs.push_back("-c"); NewArgs.push_back(ShellCommand); return launchProcess(theController, "/bin/sh", NewArgs); }