17859: Philippe Troin: better handling of process groups interactively.

This commit is contained in:
Peter Stephenson 2002-11-04 13:56:50 +00:00
parent a46aee1188
commit 14f39707cb
2 changed files with 33 additions and 5 deletions

View file

@ -1,3 +1,10 @@
2002-11-04 Peter Stephenson <pws@csr.com>
* 17859: Philippe Troin <phil@fifi.org>: Src/init.c: Better
handling of becoming process group leader in an interactive
process. We could end up with two shells reading from the
terminal at once.
2002-10-31 Wayne Davison <wayned@users.sourceforge.net>
* 17881: Src/builtin.c, Src/params.c: made the elapsed time in the

View file

@ -457,19 +457,40 @@ init_io(void)
opts[USEZLE] = 0;
#ifdef JOB_CONTROL
/* If interactive, make the shell the foreground process */
/* If interactive, make sure the shell is in the foreground and is the
* process group leader.
*/
mypid = (zlong)getpid();
if (opts[MONITOR] && interact && (SHTTY != -1)) {
if ((mypgrp = GETPGRP()) > 0) {
sigset_t blockset, oldset;
sigemptyset(&blockset);
sigaddset(&blockset, SIGTTIN);
sigaddset(&blockset, SIGTTOU);
sigaddset(&blockset, SIGTSTP);
oldset = signal_block(blockset);
while ((ttpgrp = gettygrp()) != -1 && ttpgrp != mypgrp) {
sleep(1); /* give parent time to change pgrp */
mypgrp = GETPGRP();
if (mypgrp == mypid)
attachtty(mypgrp);
if (mypgrp == mypid) {
signal_setmask(oldset);
attachtty(mypgrp); /* Might generate SIGT* */
signal_block(blockset);
}
if (mypgrp == gettygrp())
break;
killpg(mypgrp, SIGTTIN);
signal_setmask(oldset);
read(0, NULL, 0); /* Might generate SIGT* */
signal_block(blockset);
mypgrp = GETPGRP();
}
if (mypgrp != mypid) {
if (setpgrp(0, 0) == 0) {
mypgrp = mypid;
attachtty(mypgrp);
} else
opts[MONITOR] = 0;
}
signal_setmask(oldset);
} else
opts[MONITOR] = 0;
} else