Linux中的select()和poll()

时间:2013-04-29 14:53:39

标签: linux kernel file-descriptor

所以,我一直在阅读关于选择和轮询手册页,但不幸的是,我仍然对某些事情感到困惑。如果有人能为我回答以下问题,那就太好了:

  • 在非阻塞模式下打开文件时会发生什么? (设置了O_NONBLOCK标志)
  • 当有数据是缓冲区时,read()会阻塞还是返回什么?
  • 当缓冲区中没有任何数据要读取时会发生什么?

2 个答案:

答案 0 :(得分:3)

  

在非阻塞模式下打开文件会发生什么? (设置了O_NONBLOCK标志)

I / O操作不会阻塞,而是返回一个错误代码,表明它们已被阻止。

  

当数据是缓冲区时,read()会阻塞还是返回什么?

当缓冲区中有数据时,read会返回它。

  

当缓冲区中没有任何数据要读取时会发生什么?

如果套接字阻塞,它将阻塞,直到可以返回一些数据。如果套接字是非阻塞的,它将返回一个错误代码,指示如果套接字阻塞它将被阻塞。

顺便说一句,selectpoll的一个重要注意事项 - 它们几乎不应该用于阻塞套接字。当您从selectpoll获得读取或写入命中时,这意味着在您调用函数之间的某个时间执行的假设,规范操作以及返回时不会被阻止。这些是状态报告功能,不提供未来保证。如果您正在编写一个必须永不阻止的程序,则必须将其所有套接字设置为非阻塞。

答案 1 :(得分:3)

  

在非阻塞模式下打开文件会发生什么? (O_NONBLOCK   标志已设置)

  • 如果无法立即打开文件,open()将返回错误而不是阻止,open()可能仅阻止使用FIFO。
  • 如果open()成功,则所有IO操作都将是非阻塞的。这意味着,如果IO操作无法立即完成,则会部分执行或失败并显示错误(EAGAIN或EWOULDBLOCK)。
  

当数据是缓冲区时,read()会阻塞还是返回什么?

  • 当没有要读取的数据时,会发生阻塞和非阻塞read()之间的区别。因此,当缓冲区中有数据时,非阻塞read()将返回它。
  

当缓冲区中没有任何数据要读取时会发生什么?

  • 如果没有数据,非阻塞read()将返回EAGAIN错误。