qpid-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Andrew Stitcher (JIRA)" <qpid-...@incubator.apache.org>
Subject [jira] Commented: (QPID-2367) Early Initialization of File Descriptors Conflicts With Daemon Best Practices
Date Thu, 28 Jan 2010 15:55:34 GMT

    [ https://issues.apache.org/jira/browse/QPID-2367?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12805967#action_12805967

Andrew Stitcher commented on QPID-2367:

Obviously, as I imply in my first comment, there is a simple work around, which is not to
close all the fds before forking to daemonise.

I think that you really only need to close 0,1,2 when daemonising anyway (just to make sure
you don't have a stdin,stdout,stderr) and reopen them as /dev/null. More important is creating
a new processs group so you don't get terminal signals.

When we daemonise qpidd we only close 0,1,2 and reopen as /dev/null and call setsid(). That
I believe is minimally required, anything else is not.

> Early Initialization of File Descriptors Conflicts With Daemon Best Practices
> -----------------------------------------------------------------------------
>                 Key: QPID-2367
>                 URL: https://issues.apache.org/jira/browse/QPID-2367
>             Project: Qpid
>          Issue Type: Improvement
>          Components: C++ Client
>    Affects Versions: 0.5
>         Environment: Linux (possibly all UNIX), c++, g++
>            Reporter: Jason Schlauch
> At least one file descriptor (in qpid/sys/epoll/EpollPoller.*) in the c++ client is global
and declared as static.  In programs linked against the c++ qpid libs g++ generates code for
allocation and, more importantly, initialization of these descriptors that occurs before main().
 You can confirm this with gdb by breakpointing both the initialization and main() (the initialization
break is hit first).
> On the other hand, the canonical recipe for creating a UNIX daemon calls for the closing
of all open file descriptors after fork()ing (where the fork() certainly occurs after main()).
 While not an absolute requirement, closing all open file descriptors is considered a best
practice.  A loop to close all descriptors is also common in boilerplate daemon creation code
and has undoubtedly been cut-and-pasted into numerous daemons.
> The net effect is that the typical daemon will close the file descriptor opened before
main() in the c++ client library.  In the case of the epoll code this manifests as an inability
to connect to the broker.
> A fix for this would be to defer the initialization of the file descriptor (perhaps via
the Singleton pattern or a move of the variables into a class member).

This message is automatically generated by JIRA.
You can reply to this email to add a comment to the issue online.

Apache Qpid - AMQP Messaging Implementation
Project:      http://qpid.apache.org
Use/Interact: mailto:dev-subscribe@qpid.apache.org

View raw message