2

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

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

2 回答 2

3

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

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

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

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

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

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

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

于 2013-04-29T14:58:49.387 回答
3

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

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

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

  • 当没有数据要读取时,会出现阻塞和非阻塞 read() 的区别。因此,当缓冲区中有数据时,非阻塞 read() 将其返回。

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

  • 如果没有数据,非阻塞 read() 返回 EAGAIN 错误。
于 2013-04-29T15:47:53.817 回答