[ 
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-subscr...@qpid.apache.org

Reply via email to