diff --git a/fish.cpp b/fish.cpp index 24499c755..8235c529f 100644 --- a/fish.cpp +++ b/fish.cpp @@ -389,7 +389,6 @@ int main(int argc, char **argv) set_main_thread(); setup_fork_guards(); - save_term_foreground_process_group(); wsetlocale(LC_ALL, L""); is_interactive_session=1; @@ -410,6 +409,12 @@ int main(int argc, char **argv) no_exec = 0; } + /* Only save (and therefore restore) the fg process group if we are interactive. See #197, #1002 */ + if (is_interactive_session) + { + save_term_foreground_process_group(); + } + const struct config_paths_t paths = determine_config_directory_paths(argv[0]); proc_init(); @@ -511,6 +516,7 @@ int main(int argc, char **argv) proc_fire_event(L"PROCESS_EXIT", EVENT_EXIT, getpid(), res); + restore_term_mode(); restore_term_foreground_process_group(); history_destroy(); proc_destroy(); diff --git a/reader.cpp b/reader.cpp index 228fa9183..3bd40d011 100644 --- a/reader.cpp +++ b/reader.cpp @@ -993,10 +993,18 @@ void reader_init() void reader_destroy() { - tcsetattr(0, TCSANOW, &terminal_mode_on_startup); pthread_key_delete(generation_count_key); } +void restore_term_mode() +{ + // Restore the term mode if we own the terminal + // It's important we do this before restore_foreground_process_group, otherwise we won't think we own the terminal + if (getpid() == tcgetpgrp(STDIN_FILENO)) + { + tcsetattr(STDIN_FILENO, TCSANOW, &terminal_mode_on_startup); + } +} void reader_exit(int do_exit, int forced) { diff --git a/reader.h b/reader.h index 28340ad7a..0d7a58f17 100644 --- a/reader.h +++ b/reader.h @@ -46,6 +46,9 @@ void reader_init(); */ void reader_destroy(); +/** Restore the term mode at startup */ +void restore_term_mode(); + /** Returns the filename of the file currently read */