2011-04-10 73 views

回答

7

的联系您发布的内容是正确的。以非阻塞模式打开的常规文件套接字将始终“准备就绪”以供读取;当你真正尝试阅读它时,会发生阻塞(或者更准确地说,你的源指出,睡眠),直到操作成功。

在任何情况下,我认为你的源需要一些镇静剂。一个生气的人,就是。

+2

只对我发脾气。 – 2011-04-28 01:04:15

1

你是正确的,非阻塞模式,普通文件没有任何好处,而且不允许。如果可以设置一个辅助标志以及O_NONBLOCK来改变这种情况,那将会很不错,但是由于缓存和虚拟内存的工作方式,定义什么正确的“非阻塞”行为实际上并不是一件容易的事情对于普通文件意味着。当然,除非你允许程序锁定与文件关联的内存,否则会有竞争条件。 (事实上​​,一个方式来实现一种非睡IO为普通文件将mmap文件和mlock地图。在此之后,在任何合理的实施,readwrite绝不会只要睡的文件偏移和仍然是映射区域的范围内的缓冲区大小。)

+0

关于mmap()...它会阻止文件变成非阻塞... ;-) – 2013-11-18 07:06:12

+1

这不是非常难以定义非阻塞行为对普通文件意味着什么。当下一个'read'请求的数据位于页面缓存中时,内核必须发信号通知文件已准备好读取。如果它过去了,内核可能会返回'EWOULDBLOCK'(并且将请求的范围添加到某些必需的预取中,并且当它可用时,文件将被设置为可读取等等)。如果每个人都得到正确执行,这不会是一种竞争条件,但如果许多流程不断尝试彼此解读而没有取得进展,那么就会存在活锁的可能性。 – DepressedDaniel 2017-03-14 02:08:11

4

我一直在挖掘到这相当严重,在过去几个小时,可以证明该链接的你引用的作者是正确的。但是,在原生Linux Kernel for v2.6 +中,似乎是“更好”(使用该术语非常松散)支持non-blocking IO against regular files。 “libaio”包中包含一个公开内核提供的功能的库,但它对于支持的不同类型的文件系统有一些警告,并且它不能移植到Linux 2.6+以外的任何内容。

而这里的another good article关于这个问题的。