假设我在包含一堆读文件描述符的FD_SET上调用select()。如果在select()调用期间发生文件描述符关闭,会发生什么情况?假设发生了某种错误,那么是否有责任从集合中查找并移除关闭的文件描述符?Unix:在调用select()时关闭读文件描述符会发生什么()
9
A
回答
4
我不相信这是指定的任何地方;一些系统可能立即从select
返回,而其他系统可能会继续阻止。请注意,这种情况发生的唯一方式是在多线程过程中(否则,close
在select
期间不会发生;即使它发生自信号处理程序,select
也会被信号中断)。因此,这种情况可能表明你有更大的问题需要担心。如果您正在轮询的文件描述符中的一个可以在select
期间关闭,则更大的问题是相同的文件描述符可能会被重新分配给紧接在close
之后的新打开的文件(例如,在另一个不相关的线程中打开的文件)那么轮询可能会错误地在“属于”另一个线程的新文件上执行IO。
如果你有一个由一组将与select
在多线程程序轮询的文件描述符的数据对象,你几乎肯定需要使用某种形式的同步原语来控制访问该组,并加入或删除文件描述符应该需要一个与select
(或成员上的任何IO)正在进行的可能性互斥的锁。
当然,在多线程程序中,最好不要使用select
,而是让多个线程中的IO阻塞,而不用复杂的锁定逻辑来实现所需的结果。
1
select()
系统调用需要三个fd_set
参数:发送,接收,异常。要检查,如果读取文件描述符发生错误,请将其包含在读取(接收)和错误(exceprion)集合中 - 在从select()
返回的异常集中查看它意味着该套接字发生异常,你有机会找出什么。
一般来说,任何异常的网络套接字将不再适合发送和接收。
1
即使您已经读取了所有发送的数据,封闭的套接字始终被视为可以读取。选择将解除阻塞,表明套接字可用。
相关问题
- 1. 关闭文件描述符
- 2. 什么是关闭一个无效的文件描述符呢?
- 3. python关闭文件描述符问题
- 4. UNIX文件描述符重用
- 5. 如果关闭(2)单独线程中的文件描述符,select(2)会做什么?
- 6. 关闭原始文件描述符后,重复的描述符文件是否关闭?
- 7. Unix中的文件描述符帮助
- 8. 关闭文件描述符是怎么回事?
- 9. 如何使用sdbus发送Unix文件描述符?
- 10. 什么是文件描述符?
- 11. 复制文件失败,EBADF关闭输出文件描述符
- 12. 关闭文件指针而不关闭底层文件描述符
- 13. 用文件描述符调用dlopen?
- 14. 为什么ProtocolBuffers生成描述符?
- 15. fgets正在从关闭的文件描述符中读取更多数据
- 16. 如何在python中关闭文件描述符?
- 17. 在子进程中关闭已打开的文件描述符
- 18. 在C中关闭管道,dup2,文件描述符?
- 19. 调用fdopen:坏的文件描述符
- 20. 文件描述符和系统调用
- 21. C++,如果文件在读取时移动会发生什么?
- 22. 当Android应用程序强行关闭时会发生什么
- 23. 为什么stdio.h会打印写入用文件描述符打开的文件?
- 24. 什么是包描述符?
- 25. 什么是描述符?
- 26. 关闭了一个名为文件描述符
- 27. Linux内核 - 套接字文件描述符关闭位置
- 28. 如何通过Linux shell命令关闭文件描述符
- 29. 父/子进程关闭文件描述符
- 30. 错误的文件描述符关闭Boost套接字
请记住,当您在select()调用中时,驻留在fd_set中的filedescriptor的唯一可能方式可以关闭,如果另一个线程关闭()该描述符。 (有一个tcp连接被peer或你本地的tcp/ip栈关闭是另一回事)。 – nos 2012-04-06 16:46:18
另请参阅http://stackoverflow.com/questions/3884110/what-is-select-supposed-to-do-if-you-close-a-monitored-fd – 2012-04-06 18:13:36