调用 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) 然而,出于某种我不知道的奇怪原因,我说了 :-)
读者: 有一个问题困扰着我。据我所知,在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) 然而,出于某种我不知道的奇怪原因,我说了 :-)