On 10/20/2010 1:09 AM, Andy Koppe wrote:
On 20 October 2010 04:17, Ken Brown<kbr...@cornell.edu> wrote:
Emacs creates a subprocess that runs an interactive bash shell. Emacs wants
to get the PGID of the foreground process group associated to the tty of
this shell, and it does this on Linux via TIOCGPGRP (or equally well
tcgetpgrp). I think it uses the file descriptor of the master of the pty
for this purpose. If you (or some other programmer reading this) could give
me the code for setting all this up, I could play with it and try to figure
out why I'm seeing a difference between Linux and Cygwin here. I just don't
know how to create a subprocess, give it a terminal, etc.
Here's a test along those lines that does show a difference between
Linux and Cygwin:
#include<stdio.h>
#include<pty.h>
int main(void)
{
int pid, fd;
pid = forkpty(&fd, 0, 0, 0);
if (!pid)
sleep(2);
else {
sleep(1);
printf("pid=%i fd=%i pgrp=%i\n", pid, fd, tcgetpgrp(fd));
}
}
Thanks, Andy. I had no idea how to do this.
On Linux, where it requires -lutil to link, this gives:
pid=13308 fd=3 tcgetpgrp(fd)=13308
I can confirm this on my Linux system. I mention this because
apparently tcgetpgrp isn't the same on all Linux systems. See below.
On Cygwin:
pid=268 fd=3 tcgetpgrp(fd)=0
Corinna made tcgetpgrp return 0 instead of -1 in some circumstances (see
http://www.cygwin.com/ml/cygwin-patches/2009-q4/msg00045.html) because
she saw Linux doing that. But when I run Corinna's test on my Linux
system, I get -1 where she got 0. So not all Linuxes agree on what
tcgetpgrp should do.
Neither of those looks POSIX-compliant to me, because tcgetpgrp should
return -1 since fd 3 isn't the controlling terminal of the calling
process, but the Linux behaviour is rather useful. Perhaps they
decided to apply that restriction only to the slave side?
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