调用 write() 的正确方法是什么?

which is right way to call write()?

读者: 有一个问题困扰着我。据我所知,在Linux中调用write()有两种方式。像这样: 代码 1:

write(DEV, buf, count);

代码 2:

int write_total = 0;
while (write_total < count) {
    int len = write(DEV, buf, count);
    write_total += len;
}

DEV是网络还是设备有区别吗? 我的领导告诉我,如果 DEV 是网络 fd,代码 2 是正确的方法,因为它是流媒体。 谁为 DEV 提供写入计数字符的安全性?内核还是程序员?

谢谢!

write 实际写入的字节数 可能比您请求的少 个字节,因此不能依赖第一个选项。

但是,第二个选项也不可行,因为如果它写入了您请求的 20 个字节中的 10 个,您将尝试再次写入 所有 个字节。

更好的方法是从以下内容开始:

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() 函数,这样您的主代码就不会被重复的片段所包围,比如这个。


(a) 然而,出于某种我不知道的奇怪原因,我说了 :-)