diff --git a/Shell/Shell.cpp b/Shell/Shell.cpp index cf6c66a9f7..de8a103a91 100644 --- a/Shell/Shell.cpp +++ b/Shell/Shell.cpp @@ -522,6 +522,12 @@ RefPtr Shell::run_command(const AST::Command& command) if (child == 0) { setpgid(0, 0); tcsetattr(0, TCSANOW, &default_termios); + if (command.should_wait) { + auto pid = getpid(); + auto pgid = getpgid(pid); + tcsetpgrp(STDOUT_FILENO, pgid); + tcsetpgrp(STDIN_FILENO, pgid); + } for (auto& rewiring : rewirings) { #ifdef SH_DEBUG dbgprintf("in %s<%d>, dup2(%d, %d)\n", argv[0], getpid(), rewiring.dest_fd, rewiring.source_fd); @@ -618,7 +624,7 @@ Vector> Shell::run_commands(Vector& commands) jobs_to_wait_for.append(job); } else if (command.should_notify_if_in_background) { job->set_running_in_background(true); - restore_stdin(); + restore_ios(); } } } @@ -641,9 +647,11 @@ bool Shell::run_file(const String& filename, bool explicitly_invoked) run_command(data); return true; } -void Shell::restore_stdin() +void Shell::restore_ios() { tcsetattr(0, TCSANOW, &termios); + tcsetpgrp(STDOUT_FILENO, m_pid); + tcsetpgrp(STDIN_FILENO, m_pid); } void Shell::block_on_job(RefPtr job) @@ -660,13 +668,13 @@ void Shell::block_on_job(RefPtr job) loop.quit(0); }; if (job->exited()) { - restore_stdin(); + restore_ios(); return; } loop.exec(); - restore_stdin(); + restore_ios(); } String Shell::get_history_path() @@ -1030,7 +1038,7 @@ Vector Shell::complete_option(const String& program_ bool Shell::read_single_line() { - restore_stdin(); + restore_ios(); auto line_result = editor->get_line(prompt()); if (line_result.is_error()) { diff --git a/Shell/Shell.h b/Shell/Shell.h index 5f6dd91b9c..0da1fd1c6a 100644 --- a/Shell/Shell.h +++ b/Shell/Shell.h @@ -132,7 +132,7 @@ public: Vector complete_user(const String&, size_t offset); Vector complete_option(const String&, const String&, size_t offset); - void restore_stdin(); + void restore_ios(); u64 find_last_job_id() const; const Job* find_job(u64 id); diff --git a/Shell/main.cpp b/Shell/main.cpp index be79d761d5..bb40b3d2e7 100644 --- a/Shell/main.cpp +++ b/Shell/main.cpp @@ -131,6 +131,7 @@ int main(int argc, char** argv) sigset_t blocked; sigemptyset(&blocked); sigaddset(&blocked, SIGTTOU); + sigaddset(&blocked, SIGTTIN); pthread_sigmask(SIG_BLOCK, &blocked, NULL); #endif #ifdef __serenity__