X-Recipient: archive-cygwin@delorie.com
X-SWARE-Spam-Status: No, hits=0.2 required=5.0	tests=AWL,BAYES_40,SPF_NEUTRAL,T_RP_MATCHES_RCVD
X-Spam-Check-By: sourceware.org
Message-ID: <4CB9DE15.8010308@cornell.edu>
Date: Sat, 16 Oct 2010 13:17:09 -0400
From: Ken Brown <kbrown@cornell.edu>
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.9) Gecko/20100915 Thunderbird/3.1.4
MIME-Version: 1.0
To: cygwin <cygwin@cygwin.com>
Subject: Sending signals to a subprocess
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit
X-IsSubscribed: yes
Mailing-List: contact cygwin-help@cygwin.com; run by ezmlm
List-Id: <cygwin.cygwin.com>
List-Subscribe: <mailto:cygwin-subscribe@cygwin.com>
List-Archive: <http://sourceware.org/ml/cygwin/>
List-Post: <mailto:cygwin@cygwin.com>
List-Help: <mailto:cygwin-help@cygwin.com>, <http://sourceware.org/ml/#faqs>
Sender: cygwin-owner@cygwin.com
Mail-Followup-To: cygwin@cygwin.com
Delivered-To: mailing list cygwin@cygwin.com

I could use some help fixing a longstanding bug in the Cygwin build of 
emacs, in which emacs is unable to send signals to subprocesses.  A 
symptom from the user's point of view is that one cannot interrupt a 
process in shell mode by typing C-c C-c.  I've found a workaround that 
handles that case (SIGINT), as well as SIGQUIT and SIGTSTP.  But as long 
as I'm fixing this, I'd like to do it right and figure out how to handle 
all signals.

This boils down to finding the right process group ID to pass to 'kill'. 
On systems that have TIOCGPGRP, emacs uses the following code (in 
src/process.c) to get this ID:

/* Return the foreground process group for the tty/pty that
    the process P uses.  */
static int
emacs_get_tty_pgrp (p)
      struct Lisp_Process *p;
{
   int gid = -1;

#ifdef TIOCGPGRP
   if (ioctl (p->infd, TIOCGPGRP, &gid) == -1 && ! NILP (p->tty_name))
     {
       int fd;
       /* Some OS:es (Solaris 8/9) does not allow TIOCGPGRP from the
	 master side.  Try the slave side.  */
       fd = emacs_open (SDATA (p->tty_name), O_RDONLY, 0);

       if (fd != -1)
	{
	  ioctl (fd, TIOCGPGRP, &gid);
	  emacs_close (fd);
	}
     }
#endif /* defined (TIOCGPGRP ) */

   return gid;
}

What's the right way to do this in Cygwin?

Ken

--
Problem reports:       http://cygwin.com/problems.html
FAQ:                   http://cygwin.com/faq/
Documentation:         http://cygwin.com/docs.html
Unsubscribe info:      http://cygwin.com/ml/#unsubscribe-simple

