OSDN Git Service

* fhandler.h (fhandler_console::tc_getpgid): New function.
authorcgf <cgf>
Fri, 7 Oct 2011 13:52:20 +0000 (13:52 +0000)
committercgf <cgf>
Fri, 7 Oct 2011 13:52:20 +0000 (13:52 +0000)
* spawn.cc (spawn_guts): Add logic to put pure-windows processes "in the
background" when they are started that way.

winsup/cygwin/ChangeLog
winsup/cygwin/fhandler.h
winsup/cygwin/spawn.cc

index 82de82a..186f22f 100644 (file)
@@ -1,4 +1,11 @@
 2011-10-07  Corinna Vinschen  <corinna@vinschen.de>
+           Christopher Faylor  <me.cygwin2011@cgf.cx>
+
+       * 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  <corinna@vinschen.de>
 
        * include/sys/cygwin.h (cygwin_getinfo_types): Define values
        additionally as preprocessor symbols.
index 3cbcba9..be6e012 100644 (file)
@@ -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)
   {
index 37769f7..40c28f7 100644 (file)
@@ -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