5

在 Linuxwrite()函数中相当高的级别,它过滤掉写入 0 长度缓冲区的请求。这是有道理的。谁愿意让操作系统浪费时间钻透层层以确定没有工作要做?

嗯……我。

它与Linux Kernel 中的 I2C 写确认轮询有关;并且发现如果握手错误时地址(在数据之前在总线上发送)将给出错误,则位碰撞 I2C 驱动程序将给出一个潜在有用的返回代码。

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

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

4

6 回答 6

5

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

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

程序员的时间很贵,CPU 的时间很便宜。要求程序员编写相同的 API 调用 N 次以找出 API 本身可以自行解决的一些世界状态,这试图将其颠倒过来。

因此,最佳实践是让驱动程序尽其所能确保您的 write() 成功。如果可以通过检查世界的某些状态来提前预测它不能成功,那也许应该是一个ioctl()。

于 2009-08-10T15:15:11.400 回答
2

只是为了结束,我会接受 Warren Young 的更新驱动程序和发布补丁的想法(当我得到一个圆的tuit时)。

于 2009-08-14T18:31:13.777 回答
1

很少,我认为 - 如果在某些驱动程序中写入的缓冲区也具有零可用空间,则零长度写入可能会阻塞。在这种情况下,不允许零长度写入可以使事情变得更简单——同时避免大量浪费的工作。

为什么不直接去掉那张支票,看看到底是什么样的地狱会松动呢?:)

于 2009-08-10T15:10:05.827 回答
0

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

于 2009-08-10T14:47:14.100 回答
0

我不寒而栗地建议使用 ioctl() 但这不是获取接口状态信息的更好接口吗?

于 2009-08-11T08:47:46.313 回答
0

零长度写入意味着什么?一般来说,写意味着数据的传输......我相信更多的问题会因为不检查它而导致大多数错误的输入到驱动程序。是的

如果它是一个单一的信息“做这个”调用你之后,我认为 ioctl 是要走的路。它不漂亮,但你能做什么?

或者,采用核选项,使用 mmap() 并将整个事物移动到用户空间。低开销,您可以编写经典的 poke 代码,例如“将 X 写入此寄存器”,这几乎似乎是您所需要的。

于 2009-08-16T19:36:34.237 回答