Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 8 Apr 1998 23:46:15 +1000
From:      Bruce Evans <bde@zeta.org.au>
To:        bde@zeta.org.au, eirvine@tpgi.com.au, freebsd-stable@FreeBSD.ORG
Cc:        ache@FreeBSD.ORG
Subject:   Re: A new Bug with FreeBSD?
Message-ID:  <199804081346.XAA25552@godzilla.zeta.org.au>

next in thread | raw e-mail | index | archive | help
>>I presume this shouldn't happen on a Unix system -
>>all processes should be children of the logged in
>>user, and thus should get KILL'ed when the user
>>exits, no matter how they exit.

I wrote:
>Not in POSIX.1-1990.  Killing is associated with exit() of controlling
>processes (telnet in this case).  SIGHUP is sent to each process in the
            actually $SHELL
>_foreground_ process group of the controlling terminal of the controlling
>process, and if exit of the controlling process causes a process group
>to become orphaned and any member in the newly orphaned process group is
>stopped, than a SIGHUP followed by a SIGCONT is sent to every process in
>the newly orphaned process group here.  I'm not sure of the details here,
>but this normally results in propagation of SIGHUP being limited to one
>or two levels of the process tree - shells propagate it, but mail programs
>don't.  Death of the controlling terminal results in reads on the c.t.
>returning -1/EIO (the more usual 0 is not returned due to a kernel bug),
>and interactive processes should exit when they read -1 or 0 on stdin
>or /dev/tty.  libncurses has perfectly broken handling of both types of
>EOF, so programs that use it usually spin when the controlling terminal
>goes away.

The bug is easier to demonstrate and the process groups are easier to
follow using just $SHELL, mail and ee.  Just run mail and invoke the
editor; then kill the shell using another login.  Before the shell is
killed, `ps j -t vN' gives something like:

USER   PID  PPID  PGID   SESS JOBC STAT  TT       TIME COMMAND
bde    190     1   190 6fcf80    0 Is    v1    0:00.22 -bash (bash)
bde    460   190   460 6fcf80    1 I+    v1    0:00.02 mail
bde    461   460   460 6fcf80    1 I+    v1    0:00.10 ee /tmp/ReCnm460

The foreground process group is 460, and ee is in it, so sending a SIGHUP
to the foreground process group should work.  However, killing the shell
gives something like:

USER   PID  PPID  PGID   SESS JOBC STAT  TT       TIME COMMAND
bde    461     1   460 6fcf80    0 R     v1-   0:17.20 ee /tmp/ReCnm460
root   485     1   485 746e00    0 Ss+   v1    0:00.02 /usr/libexec/getty Pc tt

ee ignores SIGHUP:

---
int
main(argc, argv)		/* beginning of main program		*/
int argc;
char *argv[];
{
	int counter;

	for (counter = 1; counter < 24; counter++)
		signal(counter, SIG_IGN);
---

There are almost 24 bugs here (one for each signal ignored).  Some
signals are handled better later, but SIGHUP isn't, and even if it
were, an early SIGHUP would be lost.

Bruce

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-stable" in the body of the message



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199804081346.XAA25552>