这是正确的方式来调用write()?
问题描述:
ers: 有一个问题困扰我。据我所知,有两种方法可以在Linux中调用write()。像这样: 代码1:这是正确的方式来调用write()?
write(DEV, buf, count);
代码2:
int write_total = 0;
while (write_total < count) {
int len = write(DEV, buf, count);
write_total += len;
}
有什么区别,如果DEV是网络或设备? 我的领导告诉我Code2是正确的方法,如果DEV是网络fd,因为它的流媒体。 谁给文字计数字符安全的DEV?内核还是程序员?
谢谢!
答
write
实际上可能会写更少的字节可能比您要求的更多,因此不能依赖第一个选项。
但是,第二个选项也是不可行的,因为如果它写了你请求的二十个字节中的十个字节中的十个,那么你将尝试再次写入所有的这些字节。
更好的方法开始是这样的:
int bytes_written = 0;
while (bytes_written < count) {
int len = write(DEV, &(buf[bytes_written]), count - bytes_written);
if (len < 0)
break;
bytes_written += len;
}
此调整尝试基于已经写入量每次写入数据。它也检测错误并在这种情况下停止操作。
而且,不用说(a),这可能应该被重构为write_no_matter_what()
函数,以便您的主代码不会像这样重复的段落。
(一)然而,对于一些奇怪的原因不明给我,我说这:-)
+0
哦,是的,谢谢你的耐心。 :-) –
这取决于一个*很多*的FD是指向什么样的对象,但是一般来说,你应该使用第二个(修复错误,处理错误,并且通常在EAGAIN上缓冲) – o11c
'pipe(7)'是一个很好的解读,因为它显示了大多数有趣的行为,没有太多很多绒毛。 – o11c
你应该仔细阅读[写(2)](http://man7.org/linux/man-pages/man2/write.2.html)(更一般地说,你正在使用的每个功能的文档) –