how process in background can kill itself after logout (BSD unix).
Maarten Litmaath
maart at cs.vu.nl
Wed Jan 30 10:01:31 AEST 1991
In article <1991Jan29.012702.7265 at nntp-server.caltech.edu>,
fjs at nntp-server.caltech.edu (Fernando J. Selman) writes:
)
)I would like to be able for a process I have running in the
)background to kill itself after I logout. I am using BSD unix
)in a Sun Sparcserver 490. Because a bug in the OS the process
)keep writing to the terminal after I logout. Any help will
)be appreciated.
If your loginshell is `sh' each background job will receive a SIGHUP
when you logout, unless it ignores the signal (e.g. when started by
`nohup').
The csh on the other hand arranges things in such a way that the
SIGHUP isn't sent in the first place. If you do want the signal to
be sent, you could use the `hup' program included below.
--------------------cut here--------------------
/*
* hup.c
* Run a background job in the process group of its parent (the shell),
* so that it will receive a SIGHUP on logout.
* Usage: hup command
* Note: `hup' will put `command' in the background itself, so there's no
* need for a trailing `&'.
* Compile with `-DNO_FCNTL' if your UNIX variant doesn't have fcntl(2).
* If your shell is csh, you might want to end your `.logout' file with an
* `exec' command (e.g. `exec true') to get `hup' to work on an `rlogin'. :-(
* Author: Maarten Litmaath @ VU Informatika Amsterdam (maart at cs.vu.nl)
*/
#include <stdio.h>
#include <signal.h>
#ifdef NO_FCNTL
#include <sys/ioctl.h>
#else
#include <fcntl.h>
#endif /* NO_FCNTL */
char Id[] = "@(#)hup 1.1 90/08/09 Maarten Litmaath";
int Keyboard_signals[] = {
SIGINT,
SIGQUIT,
#ifdef SIGTSTP
SIGTSTP,
#endif /* SIGTSTP */
0
};
main(argc, argv)
int argc;
char **argv;
{
int pgrp, sig, i, pp[2];
char buf[1];
if (argc == 1) {
fprintf(stderr, "Usage: %s command\n", argv[0]);
exit(1);
}
pgrp = getpgrp(getppid());
if (pipe(pp) < 0) {
perror("pipe");
exit(1);
}
switch (fork()) {
case -1:
perror("fork");
exit(1);
case 0:
for (i = 0; sig = Keyboard_signals[i]; i++)
signal(sig, SIG_IGN);
if (setpgrp(0, pgrp) < 0)
perror("setpgrp");
else {
close(pp[0]);
/* set close-on-exec flag */
#ifdef NO_FCNTL
ioctl(pp[1], FIOCLEX, (int *) 0);
#else
fcntl(pp[1], F_SETFD, 1);
#endif /* NO_FCNTL */
execvp(argv[1], &argv[1]);
perror(argv[1]);
}
/* send a message to indicate failure */
write(pp[1], buf, 1);
exit(1);
}
close(pp[1]);
exit(read(pp[0], buf, 1));
}
--------------------cut here--------------------
--
Temporary files like /tmp/sh$$ are an abomination.
More information about the Comp.unix.programmer
mailing list