Я перенаправляет вывод из дочернего процесса:Перенаправление вывода дочернего процесса
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) на самом деле, не так ли? –