Mailing-List: contact cygwin-help@sourceware.cygnus.com; run by ezmlm List-Subscribe: List-Archive: List-Post: List-Help: , Sender: cygwin-owner@sources.redhat.com Delivered-To: mailing list cygwin@sources.redhat.com Date: Sat, 28 Apr 2001 17:05:01 -0400 From: Christopher Faylor To: cygwin@cygwin.com Subject: Re: cygwin apps in pipe ignore ctrl+c FIX Message-ID: <20010428170501.C7632@redhat.com> Reply-To: cygwin@cygwin.com Mail-Followup-To: cygwin@cygwin.com References: <000d01c0d022$c577c480$248a42d8@hpcustomer> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.3.11i In-Reply-To: <000d01c0d022$c577c480$248a42d8@hpcustomer>; from dbaker@direct.ca on Sat, Apr 28, 2001 at 01:32:54PM -0700 On Sat, Apr 28, 2001 at 01:32:54PM -0700, Tim Baker wrote: >In a previous message I reported that Cygwin apps running >in a pipe would ignore Ctrl+C from the command-line. So >I got the sources and built cygwin1.dll, and found the problem >in winsup/cygwin/exceptions.cc. > >This is the original code (relevant parts only): > >static BOOL WINAPI >ctrl_c_handler (DWORD type) >{ > tty_min *t = cygwin_shared->tty.get_tty (myself->ctty); > if (t->getpgid () != myself->pid || > (GetTickCount () - t->last_ctrl_c) < MIN_CTRL_C_SLOP) > return TRUE; > else > { > t->last_ctrl_c = GetTickCount (); > kill (-myself->pid, SIGINT); > t->last_ctrl_c = GetTickCount (); > return TRUE; > } >} > >The problem was that t->getpgid() returns *zero*. So I added a >check for zero as follows: Thank you for looking into this, but just as a hint, when debugging this type of thing, it is usually better to figure out if the code to not account for whether the value was zero or if it is, in fact, a bug that the value can be zero. I don't know if pgid is supposed to be nonzero in this case, but I suspect that it is. cgf >static BOOL WINAPI >ctrl_c_handler (DWORD type) >{ > if (t->getpgid () && ((t->getpgid () != myself->pid) || > ((GetTickCount () - t->last_ctrl_c) < MIN_CTRL_C_SLOP))) > return TRUE; > else > { > t->last_ctrl_c = GetTickCount (); > kill (-myself->pid, SIGINT); > t->last_ctrl_c = GetTickCount (); > return TRUE; > } >} > >Now Ctrl+C and GenerateConsoleCtrlEvent() work great for apps >in a pipe. -- Want to unsubscribe from this list? Check out: http://cygwin.com/ml/#unsubscribe-simple