调用write()的长度为零的后果是什么?

时间:2009-08-10 14:41:38

标签: io linux-kernel linux-device-driver

在Linux write()函数中处于相当高的级别,它会过滤掉写入0个长度缓冲区的请求。这是有道理的。谁想要操作系统浪费它的时间钻孔层只是为了确定没有工作要做?

嗯......我。

这与question有关;如果地址(在数据之前在总线上发送)在握手错误时会发出错误,那么发现bit-banged I2C驱动程序将提供一个可能有用的返回码。

可以在地址之后发送虚拟数据,但不能发送我正在使用的设备。 (也许我会尝试阅读......)。

所以问题是: 如果内核允许零(0)长度写入,会释放什么样的地狱?

6 个答案:

答案 0 :(得分:5)

您所描述的内容基本上与感染几个需要不可预测的内存量的Windows API的邪恶相同。实践是调用它们没有缓冲区来放置它们的工作,它们无论如何都要完成工作,而不是存储结果,而是计算它们在整个过程中需要的字节数。然后你分配一个大小的缓冲区,然后用缓冲区再次调用函数,知道大小。

这是难以形容的邪恶。这是计算机编程相当于一个腐朽的官僚机构,每个部门都要求你填写一个表格,其中包含与你给前一部门相同的大部分信息,但由于每个表格上都有不同的信息,他们不会只是复制你给其他人的表格。 Ptui!

程序员时间昂贵,CPU时间便宜。要求程序员编写相同的API调用N次以消除一些API本身可以自行解决的世界状态试图将其翻转过来。

然后,最好的做法是让驱动程序尽一切可能确保write()成功。如果可以预先通过检查世界的某个状态来预测它不会成功,那么可能应该是ioctl()。

答案 1 :(得分:2)

仅仅为了关闭,我将与Warren Young一起更新驱动程序和发布补丁(当我获得一轮tuit时)的想法。

答案 2 :(得分:1)

很少,我想 - 在某些驱动程序中,如果写入的缓冲区的可用空间为零,则零长度写入可能会阻塞。禁止零长度写入可以使事情变得更简单 - 同时避免大量浪费的工作。

为什么不删除那张支票,看看究竟是什么样的地狱? :)

答案 3 :(得分:0)

不是一个严肃的答案:你可能会得到像touch这样的程序:P

答案 4 :(得分:0)

我不情愿地建议一个ioctl(),但这不是一个更好的接口来获取有关接口的状态信息吗?

答案 5 :(得分:0)

零长度写入是什么意思?一般来说,写入意味着数据的传输......我确信更多的问题可能是由于没有检查它并因此捕获到驱动程序的大量不良输入。 ÿ

如果是你所追求的单一信息“做这个”电话,我认为ioctl是要走的路。它不漂亮,但你能做什么?

或者,选择核选项,使用mmap()并将整个事物移动到用户空间。低开销,你可以写经典的戳代码,比如“把X写到这个寄存器”,这几乎就是你所需要的。