From: Al Viro > Sent: 04 November 2015 16:28 > On Wed, Nov 04, 2015 at 03:54:09PM +0000, David Laight wrote: > > > Sigh... The kernel has no idea when other threads are done with "all > > > io activities using that fd" - it can wait for them to leave the > > > kernel mode, but there's fuck-all it can do about e.g. a userland > > > loop doing write() until there's more data to send. And no, you can't > > > rely upon them catching EBADF on the next iteration - by the time they > > > get there, close() might very well have returned and open() from yet > > > another thread might've grabbed the same descriptor. Welcome to your > > > data being written to hell knows what... > > > > That just means that the application must use dup2() rather than close(). > > It must do that anyway since the thread it is trying to stop might be > > sleeping in the system call stub in libc at the time a close() and open() > > happen. > > Oh, _lovely_. So instead of continuation of that write(2) going down > the throat of something opened by unrelated thread, it (starting from a > pretty arbitrary point) will go into the descriptor the closing thread > passed to dup2(). Until it, in turn, gets closed, at which point we > are back to square one. That, of course, makes it so much better - > whatever had I been thinking about that made me miss that?
Do I detect a note of sarcasm. You'd open "/dev/null" (lacking a "/dev/error") and use that as the source fd. So any writes (etc) would be discarded in a safe manner, and nothing will block. David -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html