signal problems on BSD
Maarten Litmaath
maart at cs.vu.nl
Wed Mar 7 02:56:34 AEST 1990
In article <1990Mar6.070333.29327 at athena.mit.edu>,
jik at athena.mit.edu (Jonathan I. Kamens) writes:
)... While sh
)automatically sends a HUP signal to all its children when you log out
)(actually, I'm not sure the shell does this actively; it's might be a
)side-effect of the way and process groups et al work in BSD), this
It's always been the kernel. Quoting from termio(4) on SunOS 4.0.3c:
Modem Disconnect
If a modem disconnect is detected, and the CLOCAL flag is
not set in the c_cflag field, a SIGHUP signal is sent to all
processes in the distinguished process group associated with
this terminal. Unless other arrangements have been made,
this signal terminates the processes. If SIGHUP is ignored
or caught, any subsequent read() returns with an end-of-file
indication until the terminal is closed. Thus, programs
that read a terminal and test for end-of-file can terminate
appropriately after a disconnect. Any subsequent write()
will return -1 and set errno to EIO until the terminal is
closed.
)doesn't happen in csh. Therefore, the reason your process is not
)getting the signal is because the signal is never sent.
...because csh puts each job into its own process group and a the group of a
background job never equals the tty process group (by definition!).
) Here at Project Athena, we have a hack in our /bin/login which makes
)it possible to do what you want, although I don't know how universal
)this is (it isn't in the vanilla 4.3-tahoe sources, which means it isn't
)a standard 4.3bsd thing). After the child process (i.e. the login
)shell) of /bin/login exits, /bin/login does "killpg(child, SIGHUP)",
)where "child" is the process group of the child.
Why don't you let the kernel or init(8) do the killpg()? Now you have an
extra process hanging around, doing nothing but wait()ing.
) Then, any process that wants to get a HUP signal when it logs out,
)after being placed into the background upon start-up, simply does
)"setpgrp(0, getpgrp(getppid()))". In other words, "Make my process
)group the same as the process group of my parent." This overrides the
)default csh behavior of creating a new process group for each child
)process it runs. [...]
I assume you wrote a utility `hup' (the opposite of nohup(1)) too:
a) to do this setpgrp() for you (!)
b) to catch the keyboard signals (!!)
--
"Belfast: a sentimental journey to the Dark Ages - Crusades & Witchburning
- Europe's Lebanon - Book Now!" | maart at cs.vu.nl, uunet!mcsun!botter!maart
More information about the Comp.unix.questions
mailing list