我正在嘗試編寫運行外部程序的程序。從C++的外部程序捕捉stderr和stdout
我知道,我能趕上stdout
,我能趕上stdout
和stderr
共同但問題是,我能趕上stderr
和stdout
分開嗎?
我的意思是例如stderr
變量STDERR
和stdout
變量STDOUT
。我的意思是我希望他們分開。
此外,我需要在可變外部程序的退出代碼。
我正在嘗試編寫運行外部程序的程序。從C++的外部程序捕捉stderr和stdout
我知道,我能趕上stdout
,我能趕上stdout
和stderr
共同但問題是,我能趕上stderr
和stdout
分開嗎?
我的意思是例如stderr
變量STDERR
和stdout
變量STDOUT
。我的意思是我希望他們分開。
此外,我需要在可變外部程序的退出代碼。
在Windows上,您必須填寫STARTUPINFO
爲CreateProcess
捕獲標準流,並且您可以使用GetExitCodeProcess
函數獲取終止狀態。有一個例子如何非標準流重定向到父進程http://msdn.microsoft.com/en-us/library/windows/desktop/ms682499.aspx
在你可能想使用fork
代替execve
般的Linux操作系統,並配有派生進程的工作則是另一回事。
在Windows和Linux的重定向數據流具有普遍的做法 - 你必須創建若干管(每個流)和重定向子進程流成管道,父進程可以從管道中讀取數據。爲Linux
示例代碼:
int fd[2];
if (pipe(fd) == -1) {
perror("pipe");
exit(EXIT_FAILURE);
}
pid_t cpid = fork();
if (cpid == -1) {
perror("fork");
exit(EXIT_FAILURE);
}
if (cpid == 0) { // child
dup2(fd[1], STDERR_FILENO);
fprintf(stderr, "Hello, World!\n");
exit(EXIT_SUCCESS);
} else { // parent
char ch;
while (read(fd[0], &ch, 1) > 0)
printf("%c", ch);
exit(EXIT_SUCCESS);
}
編輯:如果您需要從其他程序趕上流,使用相同的stragey如上,第一fork
,第二 - 使用管道(如在上面的代碼) ,然後execve
在子過程中的另一個progrram並使用父進程的代碼等待執行結束,趕上返回代碼:
int status;
if (waitpid(cpid, &status, 0) < 0) {
perror("waitpid");
exit(EXIT_FAILURE);
}
什麼是操作系統?你知道怎樣把它們聚在一起? – ybungalobill
我正在使用Ubuntu,我知道我可以使用2>&1。但我希望他們分開。謝謝 –
看看這個答案:http://stackoverflow.com/a/12839498/1741542 –