这是正确的方式来调用write()?

这是正确的方式来调用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?内核还是程序员?

谢谢!

+1

这取决于一个*很多*的FD是指向什么样的对象,但是一般来说,你应该使用第二个(修复错误,处理错误,并且通常在EAGAIN上缓冲) – o11c

+1

'pipe(7)'是一个很好的解读,因为它显示了大多数有趣的行为,没有太多很多绒毛。 – o11c

+0

你应该仔细阅读[写(2)](http://man7.org/linux/man-pages/man2/write.2.html)(更一般地说,你正在使用的每个功能的文档) –

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

哦,是的,谢谢你的耐心。 :-) –