diff --git a/DevTools/HackStudio/TerminalWrapper.cpp b/DevTools/HackStudio/TerminalWrapper.cpp index 2314c233de..52ae3665ac 100644 --- a/DevTools/HackStudio/TerminalWrapper.cpp +++ b/DevTools/HackStudio/TerminalWrapper.cpp @@ -6,9 +6,11 @@ #include #include #include +#include #include #include #include +#include #include #include @@ -54,6 +56,9 @@ void TerminalWrapper::run_command(const String& command) m_pid = fork(); if (m_pid == 0) { + // Create a new process group. + setsid(); + const char* tty_name = ptsname(ptm_fd); if (!tty_name) { perror("ptsname"); @@ -116,6 +121,14 @@ void TerminalWrapper::run_command(const String& command) m_process_state_widget->set_tty_fd(ptm_fd); } +void TerminalWrapper::kill_running_command() +{ + ASSERT(m_pid != -1); + + // Kill our child process and its whole process group. + (void)killpg(m_pid, SIGTERM); +} + TerminalWrapper::TerminalWrapper(GWidget* parent) : GWidget(parent) { diff --git a/DevTools/HackStudio/TerminalWrapper.h b/DevTools/HackStudio/TerminalWrapper.h index 30318736d9..b5a8d4d0b6 100644 --- a/DevTools/HackStudio/TerminalWrapper.h +++ b/DevTools/HackStudio/TerminalWrapper.h @@ -11,6 +11,7 @@ public: virtual ~TerminalWrapper() override; void run_command(const String&); + void kill_running_command(); Function on_command_exit;