35 #include <sys/types.h> 42 char *stderr_file,
int *exit_status)
46 STARTUPINFO start_info;
47 PROCESS_INFORMATION proc_info;
50 std::string cmd_arg =
"";
52 BOOL inherit_flag =
FALSE;
53 HANDLE hStdIn = INVALID_HANDLE_VALUE;
54 HANDLE hStdOut = INVALID_HANDLE_VALUE;
55 HANDLE hStdErr = INVALID_HANDLE_VALUE;
58 if (exit_status !=
NULL)
63 for (i = 0, cmd_arg_len = 0; argv[
i]; i++)
72 cmd_arg_len += arg.size ();
75 cmd_arg_ptr =
strdup (cmd_arg.c_str ());
77 GetStartupInfo (&start_info);
78 start_info.wShowWindow = SW_HIDE;
82 hStdIn = CreateFile (stdin_file, GENERIC_READ, FILE_SHARE_READ,
NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,
NULL);
84 if (hStdIn == INVALID_HANDLE_VALUE)
90 SetHandleInformation (hStdIn, HANDLE_FLAG_INHERIT, HANDLE_FLAG_INHERIT);
91 start_info.dwFlags = STARTF_USESTDHANDLES;
92 start_info.hStdInput = hStdIn;
98 CreateFile (stdout_file, GENERIC_WRITE, FILE_SHARE_READ,
NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL,
NULL);
99 if (hStdOut == INVALID_HANDLE_VALUE)
104 SetHandleInformation (hStdOut, HANDLE_FLAG_INHERIT, HANDLE_FLAG_INHERIT);
105 start_info.dwFlags = STARTF_USESTDHANDLES;
106 start_info.hStdOutput = hStdOut;
112 CreateFile (stderr_file, GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
NULL,
113 CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL,
NULL);
114 if (hStdErr == INVALID_HANDLE_VALUE)
120 SetHandleInformation (hStdErr, HANDLE_FLAG_INHERIT, HANDLE_FLAG_INHERIT);
121 start_info.dwFlags = STARTF_USESTDHANDLES;
122 start_info.hStdError = hStdErr;
127 CreateProcess (argv[0], cmd_arg_ptr,
NULL,
NULL, inherit_flag, CREATE_NO_WINDOW,
NULL,
NULL, &start_info,
136 if (hStdIn != INVALID_HANDLE_VALUE)
138 rc = CloseHandle (hStdIn);
145 if (hStdOut != INVALID_HANDLE_VALUE)
147 rc = CloseHandle (hStdOut);
154 if (hStdErr != INVALID_HANDLE_VALUE)
156 rc = CloseHandle (hStdErr);
164 new_pid = proc_info.dwProcessId;
170 status = WaitForSingleObject (proc_info.hProcess, INFINITE);
171 if (status == WAIT_FAILED)
176 rc = GetExitCodeProcess (proc_info.hProcess, &status);
182 if (exit_status !=
NULL)
184 *exit_status = status;
186 rc = CloseHandle (proc_info.hProcess);
192 rc = CloseHandle (proc_info.hThread);
202 rc = CloseHandle (proc_info.hProcess);
208 rc = CloseHandle (proc_info.hThread);
220 if (exit_status !=
NULL)
227 if (signal (SIGCHLD, SIG_DFL) == SIG_ERR)
235 if (signal (SIGCHLD, SIG_IGN) == SIG_ERR)
253 if (stdin_file !=
NULL)
255 fp = fopen (stdin_file,
"r");
262 rc = dup2 (fileno (fp), 0);
275 if (stdout_file !=
NULL)
277 rc = unlink (stdout_file);
283 fp = fopen (stdout_file,
"w");
289 rc = dup2 (fileno (fp), 1);
302 if (stderr_file !=
NULL)
304 rc = unlink (stderr_file);
310 fp = fopen (stderr_file,
"w");
316 rc = dup2 (fileno (fp), 2);
330 rc = execv ((
const char *)
argv[0], (
char *
const *)
argv);
339 rc = waitpid (
pid, &status, 0);
345 if (exit_status !=
NULL)
347 if (WIFEXITED (status))
349 *exit_status = WEXITSTATUS (status);
int create_child_process(const char *const argv[], int wait_flag, const char *stdin_file, char *stdout_file, char *stderr_file, int *exit_status)
char * strdup(const char *str)