X-Recipient: archive-cygwin AT delorie DOT com X-Spam-Check-By: sourceware.org Date: Mon, 18 Oct 2010 14:34:38 -0400 From: Christopher Faylor To: cygwin AT cygwin DOT com Subject: Re: Sending signals to a subprocess Message-ID: <20101018183438.GA25878@ednor.casa.cgf.cx> Reply-To: cygwin AT cygwin DOT com Mail-Followup-To: cygwin AT cygwin DOT com References: <4CB9DE15 DOT 8010308 AT cornell DOT edu> <4CB9E9C0 DOT 3000509 AT cornell DOT edu> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <4CB9E9C0.3000509@cornell.edu> User-Agent: Mutt/1.5.20 (2009-06-14) Mailing-List: contact cygwin-help AT cygwin DOT com; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: cygwin-owner AT cygwin DOT com Mail-Followup-To: cygwin AT cygwin DOT com Delivered-To: mailing list cygwin AT cygwin DOT com On Sat, Oct 16, 2010 at 02:06:56PM -0400, Ken Brown wrote: >On 10/16/2010 1:17 PM, Ken Brown wrote: >> 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? > >I guess it's clear from the context, but I should have said that the >problem only arises when emacs has to communicate with the subprocess >through a tty that is not the controlling tty of emacs. So tcgetpgrp() >doesn't work. I am a little confused as to the difference between tcgetpgrp and TIOCGPGRP given this man page description from "man 4 tty_ioctl" on linux: TIOCGPGRP pid_t *argp When successful, equivalent to *argp = tcgetpgrp(fd). Get the process group ID of the foreground process group on this terminal. TIOCSPGRP const pid_t *argp Equivalent to tcsetpgrp(fd, *argp). Set the foreground process group ID of this terminal. Do you have a simple test case which demonstrates the difference between the calls? It seems odd that TIOCGPGRP would allow more access to a tty than tcgetpgrp. cgf -- 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