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

时间:2017-09-06 02:29:15

标签: linux system-calls

ERS: 有一个问题困扰我。据我所知,有两种方法可以在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是网络还是设备有区别吗? 我的领导告诉我Code 2是正确的方式,如果DEV是网络fd因为它的流媒体。 谁给安全写入计算DEV的字符?内核还是程序员?

谢谢!

1 个答案:

答案 0 :(得分:1)

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)然而,由于我不知道的一些奇怪的原因,我说的是: - )