This is the mail archive of the cygwin@cygwin.com mailing list for the Cygwin project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: bash/cmd CTRL-C problem...


FWIW this patch (Chris where should I put the in_stub declaration)

====
Index: exceptions.cc
===================================================================
RCS file: /cvs/src/src/winsup/cygwin/exceptions.cc,v
retrieving revision 1.103
diff -u -p -r1.103 exceptions.cc
--- exceptions.cc       2002/01/05 22:25:34     1.103
+++ exceptions.cc       2002/01/08 06:54:23
@@ -890,11 +890,14 @@ setup_handler (int sig, void *handler, s
 #error "Need to supply machine dependent setup_handler"
 #endif

+// Yeah, well. Where to put this?
+bool in_stub = false;
+
 /* CGF Keyboard interrupt handler.  */
 static BOOL WINAPI
 ctrl_c_handler (DWORD type)
 {
-  if (type == CTRL_LOGOFF_EVENT)
+  if (type == CTRL_LOGOFF_EVENT || (type == CTRL_C_EVENT && in_stub ==
true))
     return TRUE;

   /* Return FALSE to prevent an "End task" dialog box from appearing
Index: spawn.cc
===================================================================
RCS file: /cvs/src/src/winsup/cygwin/spawn.cc,v
retrieving revision 1.94
diff -u -p -r1.94 spawn.cc
--- spawn.cc    2001/11/05 06:09:08     1.94
+++ spawn.cc    2002/01/08 06:54:25
@@ -314,6 +314,9 @@ av::unshift (const char *what, int conv)
   return 1;
 }

+// From exceptions.cc
+extern bool in_stub; // indicate when we are wrapping a non-cygwin
program
+
 static int __stdcall
 spawn_guts (HANDLE hToken, const char * prog_arg, const char *const
*argv,
            const char *const envp[], int mode)
@@ -804,8 +807,10 @@ spawn_guts (HANDLE hToken, const char *
   MALLOC_CHECK;
   if (mode == _P_OVERLAY)
     {
+      in_stub = true; // don't close on CTRL C.
       int nwait = 3;
       HANDLE waitbuf[3] = {pi.hProcess, signal_arrived, spr};
+      // If spr is not triggered, it's not a cygwin process ?
       for (int i = 0; i < 100; i++)
        {
          switch (WaitForMultipleObjects (nwait, waitbuf, FALSE,
INFINITE))
@@ -823,6 +828,7 @@ spawn_guts (HANDLE hToken, const char *
              reset_signal_arrived ();
              continue;
            case WAIT_OBJECT_0 + 2:
+             // SPR
              if (myself->ppid_handle)
                res |= EXIT_REPARENTING;
              if (!my_parent_is_alive ())
@@ -847,6 +853,7 @@ spawn_guts (HANDLE hToken, const char *
            }
          break;
        }
+

       ForceCloseHandle (spr);

@@ -874,6 +881,8 @@ spawn_guts (HANDLE hToken, const char *
              system_printf ("old hProcess %p, hProcess %p", oldh,
myself->hProcess);
            }
        }
+      in_stub = false; // We're safely reparented now, or a cygwin
wrapped win32
+      // program has terminated.

     }
====

means that I get this output from the test programs:
=============
Administrator@LIFELESSWKS ~/t
$ ./signals.exe

>>> signals: Waiting now...
>>>>>> myclass CPP: Installing atexit handler...

>>>>>> myclass CPP: Installing signal handler...
>>>>>> myclass CPP: Falling asleep...
............................................................
>>> signals: Signal SIGINT=2 received
......................................
>>> signals: Finished waiting now...

>>> signals: Forwarding CTRL_BREAK_EVENT to the child process...
..
>>>>>> myclass CPP: SIGBREAK caught...
>>>>>> myclass CPP: Process terminating...


=================

So it looks like it solves it. I've noticed no side effects either.

Rob


--
Unsubscribe info:      http://cygwin.com/ml/#unsubscribe-simple
Bug reporting:         http://cygwin.com/bugs.html
Documentation:         http://cygwin.com/docs.html
FAQ:                   http://cygwin.com/faq/


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]