【问题标题】:How do you "flush" the write() system call?你如何“刷新” write() 系统调用?
【发布时间】:2017-10-31 06:28:22
【问题描述】:

我从用户那里获取输入,然后使用 read() 和 write() 系统调用将其打印到标准输出。出于某种原因,除了常规输出之外,它还会打印一些额外的字符。附加字符来自用户输入,因此它们不是随机的。但是,我假设这可能是由于缓冲区未清除以接收新输入的事实。我搜索了许多适合这种情况的不同事物,但我仍然感到困惑。我只为此使用低级 I/O,因此不会实现 C 标准库。我问过的大多数人都说使用“fflush”,但我认为这仅适用于我不会使用的 stdio.h 库。 提前感谢您提供有关此事的任何建议或资源。

【问题讨论】:

    标签: c++ io low-level-io


    【解决方案1】:

    如何“刷新” write() 系统调用?

    你没有。这是一个系统调用。您没有任何要刷新的应用程序端缓冲区。

    我从用户那里获取输入,然后使用read()write() 系统调用将其打印到标准输出。出于某种原因,除了常规输出之外,它还会打印一些额外的字符。

    您的代码中有错误。它应该是这样的:

    int count;
    while ((count = read(inFD, buffer, sizeof buffer)) > 0)
    {
        write(outFD, buffer, count);
    }
    

    十比一你把write的第三个参数错了。

    我问过的大多数人都说使用“fflush”,但我认为这仅适用于我不会使用的 stdio.h 库。

    他们错了,你是对的。

    【讨论】:

    • 是的,你完全正确。我的 write 系统调用的第三个参数不正确。现在一切都解决了!感谢您的所有澄清!祝你晚安。
    • int 通常有效,但要完全正确,read()write() 函数都返回 ssize_t
    【解决方案2】:

    试试这个功能:

    eraseFunction()
    {
        std::cin.clear();
        std::cin.ignore(std::cin.rdbuf()->in_avail());
    }
    

    所以一旦你 read() 你应该调用这个函数来擦除缓冲区

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-22
    • 2021-02-25
    • 1970-01-01
    • 1970-01-01
    • 2011-04-21
    • 2014-03-20
    • 2011-02-14
    • 2012-01-24
    相关资源
    最近更新 更多