From 3d1dd0789e32f3c9d99692c79bdfdb8e6e4b4be6 Mon Sep 17 00:00:00 2001 From: Christopher Faylor Date: Fri, 7 Oct 2011 13:52:20 +0000 Subject: [PATCH] * fhandler.h (fhandler_console::tc_getpgid): New function. * spawn.cc (spawn_guts): Add logic to put pure-windows processes "in the background" when they are started that way. --- winsup/cygwin/ChangeLog | 7 +++++++ winsup/cygwin/fhandler.h | 1 + winsup/cygwin/spawn.cc | 12 +++++++++++- 3 files changed, 19 insertions(+), 1 deletion(-) diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index 82de82a6e..186f22fa2 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,10 @@ +2011-10-07 Corinna Vinschen + Christopher Faylor + + * fhandler.h (fhandler_console::tc_getpgid): New function. + * spawn.cc (spawn_guts): Add logic to put pure-windows processes "in + the background" when they are started that way. + 2011-10-07 Corinna Vinschen * include/sys/cygwin.h (cygwin_getinfo_types): Define values diff --git a/winsup/cygwin/fhandler.h b/winsup/cygwin/fhandler.h index 3cbcba91d..be6e012b0 100644 --- a/winsup/cygwin/fhandler.h +++ b/winsup/cygwin/fhandler.h @@ -1100,6 +1100,7 @@ private: tty_min *tc () const {return &(shared_console_info->tty_min_state);} public: + static pid_t tc_getpgid () {return shared_console_info->tty_min_state.getpgid ();} fhandler_console (fh_devices); static console_state *open_shared_console (HWND hw, HANDLE& h) { diff --git a/winsup/cygwin/spawn.cc b/winsup/cygwin/spawn.cc index 37769f78e..40c28f77f 100644 --- a/winsup/cygwin/spawn.cc +++ b/winsup/cygwin/spawn.cc @@ -558,7 +558,17 @@ spawn_guts (const char *prog_arg, const char *const *argv, && (!ch.iscygwin () || mode != _P_OVERLAY || cygheap->fdtab.need_fixup_before ())) c_flags |= CREATE_SUSPENDED; - + /* If a native application should be spawned, we test here if the spawning + process is running in a console and, if so, if it's a foreground or + background process. If it's a background process, we start the native + process with the CREATE_NEW_PROCESS_GROUP flag set. This lets the native + process ignore Ctrl-C by default. If we don't do that, pressing Ctrl-C + in a console will break native processes running in the background, + because the Ctrl-C event is sent to all processes in the console, unless + they ignore it explicitely. CREATE_NEW_PROCESS_GROUP does that for us. */ + if (!ch.iscygwin () && myself->ctty >= 0 && iscons_dev (myself->ctty) + && fhandler_console::tc_getpgid () != getpgrp ()) + c_flags |= CREATE_NEW_PROCESS_GROUP; ch.refresh_cygheap (); /* When ruid != euid we create the new process under the current original account and impersonate in child, this way maintaining the different -- 2.43.5