.\" SUCH DAMAGE.
.\"
.\" @(#)daemon.3 8.1 (Berkeley) 6/9/93
-.\" $FreeBSD: src/lib/libc/gen/daemon.3,v 1.10 2001/10/01 16:08:50 ru Exp $
+.\" $FreeBSD: src/lib/libc/gen/daemon.3,v 1.14 2003/11/10 22:04:51 ghelmer Exp $
.\"
.Dd June 9, 1993
.Dt DAEMON 3
.Fn daemon
function is for programs wishing to detach themselves from the
controlling terminal and run in the background as system daemons.
+On Mac OS X, the use of this API is discouraged in favor of using
+.Xr launchd 8 .
.Pp
Unless the argument
.Fa nochdir
is non-zero,
.Fn daemon
-changes the current working directory to the root (``/'').
+changes the current working directory to the root
+.Pq Pa / .
.Pp
Unless the argument
.Fa noclose
is non-zero,
.Fn daemon
-will redirect standard input, standard output and standard error
-to ``/dev/null''.
+will redirect standard input, standard output, and standard error to
+.Pa /dev/null .
+.Sh RETURN VALUES
+.Rv -std daemon
.Sh ERRORS
-If an error occurs,
+The
.Fn daemon
-returns -1 and sets the global variable
+function may fail and set
.Va errno
-to any of the errors specified for the library functions
+for any of the errors specified for the library functions
.Xr fork 2
and
.Xr setsid 2 .
.Sh SEE ALSO
.Xr fork 2 ,
-.Xr setsid 2
+.Xr setsid 2 ,
+.Xr sigaction 2
.Sh HISTORY
The
.Fn daemon
function first appeared in
.Bx 4.4 .
+.Sh CAVEATS
+Unless the
+.Fa noclose
+argument is non-zero,
+.Fn daemon
+will close the first three file descriptors and redirect them to
+.Pa /dev/null .
+Normally, these correspond to standard input, standard output, and
+standard error.
+However, if any of those file descriptors refer to something else, they
+will still be closed, resulting in incorrect behavior of the calling program.
+This can happen if any of standard input, standard output, or standard
+error have been closed before the program was run.
+Programs using
+.Fn daemon
+should therefore either call
+.Fn daemon
+before opening any files or sockets, or verify that any file
+descriptors obtained have values greater than 2.
+.Pp
+The
+.Fn daemon
+function temporarily ignores
+.Dv SIGHUP
+while calling
+.Xr setsid 2
+to prevent a parent session group leader's calls to
+.Xr fork 2
+and then
+.Xr _exit 2
+from prematurely terminating the child process.