Path: utzoo!utgpu!jarvis.csri.toronto.edu!mailrus!ames!lll-winken!uunet!auspex!guy From: guy@auspex.UUCP (Guy Harris) Newsgroups: comp.unix.wizards Subject: Re: Proper way to detach from control terminal? Keywords: detach control-terminal setpgrp Message-ID: <908@auspex.UUCP> Date: 28 Jan 89 07:02:51 GMT References: <5333@brspyr1.BRS.Com> Reply-To: guy@auspex.UUCP (Guy Harris) Organization: Auspex Systems, Santa Clara Lines: 82 >I would like to know if there is a "proper" way to detach a process from >its control terminal (once it has fork'ed and the parent has >terminated). Well, it depends on which flavor of UNIX you're using.... > 1. setpgrp(2) > > This is the method described in the System V section > termio(7), and does seem to work. One would hope it would, since that's the call you're supposed to use for that in S5. > The calling sequence I am using is simply > setpgrp() for System V and setpgrp(0,getpid()) > for BSD based code. But, on BSD systems, the > control terminal is still reported when a ps(1) is > done. That's because "setpgrp" *isn't* the call you're supposed to use on BSD systems. "setpgrp" has the side effect of detaching you from your controlling terminal on S5, but it doesn't have that side effect on BSD. (The two were invented independently - at least in part - and for different purposes; the BSD one is used for job control, and processes are supposed to keep their controlling tty no matter whether they're in the foreground or in the background.) > 2. ioctl(...TIOCSPGRP...) > > Is using ioctl to set the process group any different > than using the setpgrp() system call? Yes, the system call sets the process group of a *process*, while the "ioctl" (not available currently on vanilla S5) sets the process group of a *terminal*. Basically, if you type something like your interrupt character (RUBOUT, ^C, whatever), the terminal driver sends a signal to the process group to which it belongs, which means it's delivered to all processes that are currently in that process group. > 3. ioctl(...TIOCNOTTY...) > > I have seen this used in the recently posted plp > software, but cannot find any documentation on this > setting other than "void tty association" in the > header file on a BSD system. That's what "void tty association" means - "void" a process's "association" with its controling "tty", i.e. detach itself from that tty. ("Void where prohibited by law", on the other hand, is a command telling you to urinate, say, on the White House lawn. :-)) The 4.3-tahoe TTY(4) manual page says (I think, earlier 4.3BSD manuals and maybe the 4.2BSD manual said something similar): A process can remove the association it has with its controlling terminal by opening the file "/dev/tty" and issuing an "ioctl(f, TIOCNOTTY, 0);" This is often desirable in server processes. > 4. closing all terminal files > > I don't know if I am reading things wrong, but it seems > that some programs simple close stdin/stdout/stderr on > startup and open something else as stdin. Does this > really do anything? It doesn't detach you from your controlling terminal, that's for sure.... > Should I do this in concert with any/all of the > above options? Yes, you might want to do this if your program is, say, a daemon process that's trying to run "cleanly" regardless of whether it's started from "/etc/rc" or from a user's terminal; that way, it won't "hang on" to the terminal (i.e., it won't hold it open, and won't issue messages to it). Dave Lennert (formerly of HP, now of Sequent - right, Dave?) wrote a fairly detailed paper on "how to write a daemon", going into details about these sorts of things on various UNIX flavors. I think it appeared in one of the UNIX magazines within the past few months.