Starting a daemon on a SVR3
Robert Claeson
prc at erbe.se
Mon Jan 7 23:03:29 AEST 1991
In article <25360 at adm.brl.mil> wolf at grasp1.univ-lyon1.fr writes:
>On an old AIX, I use following code to start a daemon (which does not run
>with root privileges).
[Source code deleted.]
> setbuf(stdout,NULL); printf("Listserv v0.99: daemon started\n\r");
> if (fork()) exit (0); /* Dissociate us from tty */
> for (i=getdtablesize()-1; i>=0; i--)
> (void)close(i);
> (void)open("/",0);
> (void)dup2(0,1);
> (void)dup2(0,2);
> i=open("/dev/tty",2);
> if (i>=0) {
> ioctl(i,TIOCNOTTY,(char *)0);
> (void)close(i);
> }
>This works fine, but I get trouble when porting this daemon to an SRV3.
>getdtablesize does not exist anymore, so I close all open files manually
>with a fixed loop (I put 4 in first index).
>The ioctl call does also not exist, and I found no equivalence.
>After having executed the new code it loads itself in background and
>ps shows me it does not depend anymore on a tty. Despite this, when
>I loggoff, the process is being killed. Can anyone explain me what I
>have to do to start properly a daemon? Thanx.
I believe that something along these lines should work:
setbuf(stdout,NULL);
printf("Listserv v0.99: daemon started\n\r");
if (fork()) /* Disaccociate us from controlling tty */
exit(0);
setpgrp(); /* Start a new process group */
if (fork()) /* ...and disaccociate us again */
exit(0);
I only have a vague memory of why the second fork() is needed.
--
Robert Claeson |Reasonable mailers: rclaeson at erbe.se
ERBE DATA AB | Dumb mailers: rclaeson%erbe.se at sunet.se
Jakobsberg, Sweden | Perverse mailers: rclaeson%erbe.se at encore.com
Any opinions expressed herein definitely belongs to me and not to my employer.
More information about the Comp.unix.questions
mailing list