Io 使用零长度调用write()会产生什么后果?

Io 使用零长度调用write()会产生什么后果?,io,linux-kernel,linux-device-driver,Io,Linux Kernel,Linux Device Driver,在Linuxwrite()函数的相当高的级别上,它过滤出写入0长度缓冲区的请求。这是有道理的。谁会想让操作系统浪费时间钻取层,只是为了确定没有工作要做 嗯。。。我 它与,;如果地址(在数据之前通过总线发送)在握手错误时给出错误,那么位碰撞I2C驱动程序将给出一个潜在有用的返回码 人们可以在地址后发送虚拟数据,但不能使用我正在使用的设备。(也许我会试试看……) 因此,问题是:如果内核允许零(0)长度写入,会释放出什么样的地狱?这不是一个严肃的答案:我认为,您可能会得到一个像:p这样的程序,非常少-

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

嗯。。。我

它与,;如果地址(在数据之前通过总线发送)在握手错误时给出错误,那么位碰撞I2C驱动程序将给出一个潜在有用的返回码

人们可以在地址后发送虚拟数据,但不能使用我正在使用的设备。(也许我会试试看……)


因此,问题是:如果内核允许零(0)长度写入,会释放出什么样的地狱?这不是一个严肃的答案:我认为,您可能会得到一个像:p这样的程序,非常少-如果零长度写入的缓冲区也没有可用空间,那么它可能会阻塞,在一些司机身上。在这种情况下,不允许零长度写入可以使事情变得更简单,同时避免了大量浪费的工作


为什么不干脆拿掉那张支票,看看到底是什么样的地狱出现了

您所描述的内容本质上与困扰几个需要不可预测内存量的Windows API的邪恶相同。这种做法是在没有缓冲区的情况下调用它们来放置它们的工作,它们无论如何都会执行工作,不存储结果,而是计算它们在执行过程中需要的字节数。然后分配一个该大小的缓冲区,并在知道缓冲区大小的情况下再次调用该函数

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

程序员的时间是昂贵的,CPU的时间是便宜的。要求程序员编写N次相同的API调用,以确定API本身能够自行解决的世界状态,这试图颠覆这一点


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

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

只是为了结束,我赞同Warren Young的想法,即更新驱动程序并发布补丁(当我有机会时)。

零长度写入意味着什么?一般来说,写意味着数据的传输。。。我相信,如果不检查它,从而捕捉到司机的大部分错误输入,将会导致更多的问题。y

如果只是一点信息“做这个”给你打电话,我认为ioctl是最好的选择。它不漂亮,但你能做什么


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

+1硬件解决方案属于内核。。。但如果不是这样,而且这是一个非常旧的(未维护的)内核,那么在用户空间中进行变通可能是合理的。但在这种情况下,我实际上不想编写-因此windows类比不适用。我真的想“写”零字节。否则,我会通过向已建立的驱动程序添加专有ioctl调用来更改API。我认为不应该向驱动程序添加专有调用。我认为您应该向维护该驱动程序的人员指出这种行为,并要求他们公开此功能,或者为他们提供补丁。它可以称为I2C_PING函数。ioctls()是实现这一点的一种方法/proc和sysctl是另外两个。这最终将帮助我们其他人。非常感谢。