-1
我從一個子進程重定向輸出:重定向子進程輸出
int pipefd[2];
pipe(pipefd);
pid_t pid = fork(); /* Create a child process */
switch (pid) {
case -1: /* Error */
cout << "Uh-Oh! fork() failed.\n";
exit(1);
case 0: /* Child process */
close(pipefd[0]);
dup2(pipefd[1], 1);
dup2(pipefd[1], 2);
close(pipefd[1]);
execv(args[0], (char * const *)args);
cout << "execv() error" << endl;
exit(1);
default: /* Parent process */
close(pipefd[1]);
char buffer[1024];
size_t bytes_read = 0;
bytes_read = read(pipefd[0], buffer, sizeof(buffer));
if(bytes_read == -1) {
cout << "read() error" << endl;
exit(1);
}
close(pipefd[0]);
if(bytes_read > 0) {
buffer[bytes_read-1] = '\0'; // Overwrite the newline
}
int status, exit_pid;
while(true) {
exit_pid = waitpid(pid, &status, 0);
if(exit_pid == -1) {
cout << "waitpid() error: " << strerror(errno) << endl;
exit(1);
}
else {
return WEXITSTATUS(status);
}
}
}
這工作得很好,當我跑它作爲一個獨立的代碼。但是,當我將它集成到多線程環境時,會發生一件可怕的事情:read()調用以某種方式讀取父進程的其他線程的輸出,就好像它是子進程管道的輸出一樣。 任何人都遇到過這樣的事情? 我在OS X.
其他線程使用stdout和stderr來寫輸出嗎?那麼這種行爲絕對是正常的和可以預料的。 –
是的,但我不明白爲什麼這會導致這種行爲。 pipe()調用分配新的文件描述符,並且子節點中的dup2()不影響父節點描述符表。 – Yuval
你知道什麼['dup2(pipefd [1],1);'](http://man7.org/linux/man-pages/man2/dup.2.html),你知道嗎? –