select() and poll() in Linux



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

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

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

  • 如果文件不能立即打开,open()返回一个错误而不是阻塞,open()可能只阻塞fifo。
  • 如果open()成功,所有的IO操作都是非阻塞的。这意味着,如果IO操作不能立即完成,它将被部分执行或失败并出现错误(EAGAIN或EWOULDBLOCK)。

当缓冲区中有数据时,read()阻塞或返回什么?

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

当缓冲区中没有数据可读时会发生什么?

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

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

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

当缓冲区中有数据时,read()阻塞或返回什么?

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

当缓冲区中没有数据可读时会发生什么?

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

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

相关内容

  • 没有找到相关文章

最新更新