From 409d804ee85074eed8bd94f616bc23284bdf5eb9 Mon Sep 17 00:00:00 2001 From: Maxime Coste Date: Mon, 8 Jun 2015 22:42:51 +0100 Subject: Do not close stderr/stdout before program finish Programs like grep called in '$' command will fail due to SIGPIPE for example. So we need to keep the pipe open. --- src/shell_manager.cc | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) (limited to 'src/shell_manager.cc') diff --git a/src/shell_manager.cc b/src/shell_manager.cc index ff483d89..3a64eef2 100644 --- a/src/shell_manager.cc +++ b/src/shell_manager.cc @@ -60,20 +60,18 @@ std::pair ShellManager::eval( FDWatcher stdout_watcher{read_pipe[0], pipe_reader(child_stdout)}; FDWatcher stderr_watcher{error_pipe[0], pipe_reader(child_stderr)}; - if (not (flags & Flags::ReadOutput)) - { - stdout_watcher.close_fd(); - stderr_watcher.close_fd(); - } - - while (not stdout_watcher.closed() or - not stderr_watcher.closed() or - not terminated) + while (not terminated or + ((flags & Flags::WaitForStdout) and + (not stdout_watcher.closed() or + not stderr_watcher.closed()))) { EventManager::instance().handle_next_events(EventMode::Urgent); if (not terminated) terminated = waitpid(pid, &status, WNOHANG); } + + stdout_watcher.close_fd(); + stderr_watcher.close_fd(); } if (not child_stderr.empty()) -- cgit v1.2.3