Broken pipe when socket is closed
I have a server/client app on a Linux box. If the server is not up when the client attempts to send a request, I get a SIGPIPE and the application terminates.
How can I check if the server is available on the socket before I try t开发者_如何学Pythono write?
Also of note, I do not want to trap the SIGPIPE because the client is really part of a shared object that is used by many applications that may or may not already define their own signal handling methods.
Thanks
Pass MSG_NOSIGNAL
as flags to send()
This post by kroki describes what seems to be a good method.
To summarize it:
- Check if SIGPIPE is pending. Record that in a variable. If it is pending before we even start then someone else blocked SIGPIPE. In that case skip all the signal stuff below and just do the write.
- sigblock SIGPIPE.
- Do the write.
- Check if SIGPIPE is pending.
- If it is pending then sigtimedwait for it with zero timeout.
- Unblock SIGPIPE.
精彩评论