什么是零长度调用write()的后果是什么?(What are the consequences o

2019-09-22 20:48发布

在Linux的write()函数相当高的水平,它过滤掉写0长度缓冲请求。 这是有道理的。 谁愿意要的OS浪费它的时间,通过层钻孔只确定有没有做的工作?

嗯...我。

它是与此相关的问题 ; 并发现该位模拟I2C驱动程序会给出一个可能有用的返回码,如果当握手是错误的地址(数据之前在总线上发送)会给出错误。

人们可以在地址后发送伪数据,但不能与我使用的设备。 (也许我会尝试读取...)。

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

Answer 1:

什么你所描述的金额基本上相同种类的邪恶中感染需要不可预知的内存量的几个Windows的API。 其做法是给他们打电话,没有缓冲将他们的工作,他们所做的工作,无论如何,不​​存储结果,但计算他们会沿途需要的字节数。 然后你分配该大小的缓冲区,并用缓冲区再次调用该函数,知道大小。

这是别提邪恶。 这是计算机编程相当于一个腐朽的官僚机构,其中每个部门要求你填写有大部分是你给前面部门的一个就可以了相同信息的形式,但由于每片形式在一些不同的信息,他们不会只取表格的副本你给其他人。 Ptui!

程序员的时间是昂贵的,CPU时间是便宜。 需要程序员写同样的API调用N次苏斯一些世界状态的API本身可能制定出了自己的尝试翻转此发挥得淋漓尽致。

最佳实践的话,是有司机竭尽所能,以确保您的write()成功。 如果有可能提前预测它无法通过检查世界上一些国家的成功,也许这应该是一个ioctl()。



Answer 2:

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



Answer 3:

很少,我认为 - 这是可能的,即零长度写会阻塞,如果它写入缓冲区具有零的可用空间,以及在一些司机。 不允许零长度写入可能使事情在这样的情况下,简单的 - 以及避免白白浪费了很多的工作。

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



Answer 4:

不认真的回答:你会获得类似的程序触摸 :P



Answer 5:

我不敢建议一个ioctl(),但是那不是获取有关接口的状态信息的更好的界面?



Answer 6:

什么会零长度写是什么意思? 在一般情况下,写装置的数据传输......,我相信更多的问题会被不检查它,从而捕捉最大量的坏输入到驱动程序引起的。 ÿ

如果它是一个单比特的信息“这样做”叫你之后,我觉得IOCTL是要走的路。 它是不是很漂亮,但你能做什么?

另外,采取核选项,使用mmap()和移动整个事情到用户空间。 低开销,你可以写,如“写X这个寄存器”,这看起来几乎是你所需要的经典捅代码。



文章来源: What are the consequences of calling write() with zero length?