nagios and freebsd threads issue : help please ...
Daniel Eischen
deischen at freebsd.org
Mon Aug 22 11:03:27 GMT 2005
On Mon, 22 Aug 2005, M. Warner Losh wrote:
> In message: <43088841.4090709 at nbux.com>
> Christophe Yayon <lists at nbux.com> writes:
> : http://www.opengroup.org/onlinepubs/009695399/functions/pthread_atfork.html
> :
> : "It is suggested that programs that use fork() call an exec function
> : very soon afterwards in the child process, thus resetting all states. In
> : the meantime, only a short list of async-signal-safe library routines
> : are promised to be available."
> :
> : Note *suggested*. This is a recommendation to protect against a shoddy
> : pthread-implementation. The thread specifications rule that only the
> : thread calling fork() is duplicated, which initially leads to the
> : recommendation (other threads holding locks aren't around to release
> : them in the new execution context).
>
> Here's what nagios does after a fork:
>
> in base/util.c:
>
> (1) Become the process group leader by calling setpgid(0, 0);
> (2) something called set_all_macro_environemt_vars(TRUE).
> This calls snprintf a bunch, as well as set variables
> by saving them to malloced memory. This save is done
> with strcpy and strcat. setenv is then called to try to
> export them. memory is then freed with free(3).
> (3) All signal handlers are reset
> (4) The right part of the pipe is closed
> (5) sigalarm handler is created and an alarm set.
> (6) Checks to see if it executing an embedded perl script,
> then tries to execute it if so. This has the feel of
> being too much after the fork.
> (7) Calls popen on the command if not.
> (8) Reads the output of the command using fgets.
> (9) closes the other end of the pipe
> (10) unsets all env vars.
> (11) Calls _exit()
>
>
> in base/checks.c
>
> (1) set_all_macro_environment_vars(TRUE)
> (2) forks again
> (3) granchild:
> resets handler, setpgid, etc.
> if perl script, do embedded perl, otherwise popen.
> lots of read/write to pipe.
>
> likewise in base/commands.c fork is also called for similar
> things.
>
> There's other places that also call popen.
>
> So, if any of these things is an issue, and you can point to a posix
> things that says it is an issue, then I think that the problem can be
> resolved.
You can only execute async-signal-safe functions after a fork()
from a threaded application. free(), malloc(), popen(), fgets(),
are not async-signal-safe. The list of async-signal-safe functions
are here:
http://www.opengroup.org/onlinepubs/009695399/nframe.html
The restriction on fork() is here (20th bullet down):
http://www.opengroup.org/onlinepubs/009695399/nframe.html
--
DE
More information about the freebsd-hackers
mailing list