2009-08-10 28 views
5

在Linux write()函数中处于相当高的水平,它会过滤出写入0长度缓冲区的请求。这是有道理的。谁愿意让操作系统浪费时间来浏览图层,以确定没有工作要做?调用write()的长度为零的后果是什么?

嗯...我。

这与question有关;并且如果地址(在数据之前在总线上发送)在握手错误的情况下会发出错误,则发现位串接的I2C驱动器将提供可能有用的返回码。

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

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

回答

2

只为关闭的缘故,我与更新驱动程序和发布补丁的沃伦·扬的想法去(当我得到一个圆tuit)。

+0

这将最终帮助我们其他人。谢谢 – 2009-08-28 00:41:35

0

不是一个严肃的回答:你会获得类似touch程序:P

1

很少,我认为 - 有可能是零长度写会阻塞,如果它写入缓冲区在一些司机中也有零可用空间。不允许零长度的写入可以使事情变得更简单 - 以及避免大量浪费的工作。

为什么不直接删除检查,看看是什么样的地狱居然挣脱? :)

5

你所描述的内容基本上是相同类型的邪恶,侵犯了几个Windows API需要不可预知的内存量。练习是在没有缓冲区的情况下调用它们来放置它们的工作,无论如何它们都会完成这项工作,而不会存储结果,但需要计算它们在此过程中需要的字节数。然后你分配一个这样大小的缓冲区,然后用缓冲区再次调用函数,知道大小。

这是别提邪恶。这是与腐朽的官僚机构相当的计算机编程,每个部门都要求你填写一张与你上一个部门的信息大部分相同的表格,但由于每个表格上都有一些不同的信息,他们不会仅仅拿一份你给其他人的表格的副本。 Ptui!

编程时间是昂贵的,CPU时间是便宜。要求程序员将相同的API调用写入N次,以表明API本身可以自行解决的一些世界状态试图反转这一点。最好的做法是让驱动程序尽其所能确保write()成功。如果可以事先预测它不能通过检查某个世界状态而获得成功,那么也许应该是一个ioctl()。

+0

+1硬件解决方法属于内核......但如果它不是,并且这是一个非常旧的(无法维护的)内核,那么在用户空间中解决这个问题可能是合理的。 – bdonlan 2009-08-10 15:19:05

+0

但在这种情况下,我实际上并不想写 - 所以窗口类比不适用。我真的想'写'零字节。否则,我会通过向已建立的驱动程序添加专有的ioctl调用来更改API。 – Jamie 2009-08-11 13:04:46

+3

我不认为你应该*给司机添加专有的呼叫。我认为您应该将此行为指向维护该驱动程序的人员,并要求他们为他们提供一个补丁来公开此功能。它可以被称为I2C_PING功能。 ioctls()是实现此目的的一种方法。/proc和sysctl是别人。 – 2009-08-11 23:39:37

0

我不寒而栗,建议一个ioctl(),但不会是一个更好的接口获得有关接口的状态信息?

0

什么将一个零长度写的是什么意思?一般来说,写入意味着数据的传输......我相信更多的问题会由于不检查而导致,从而导致大量的错误输入给驱动程序。y

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

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

相关问题