gpt4 book ai didi

c++ - 对于从 C++ 编写敏感日志文件,文件描述符上的 write() 或文件上的 fprintf() 哪个更好?

转载 作者:行者123 更新时间:2023-11-28 04:07:23 28 4
gpt4 key购买 nike

我的理解是write()是系统调用,速度极慢。 (这几乎就像一种进程间通信。)任何与 FILE 一起工作的东西都是缓冲的,并且每 512 个字节或你有什么只做一次系统调用。所以速度方面 FILE 应该快得多。

但是,如果您有一条日志消息后跟导致核心转储的内容,我不知道操作系统可以利用什么机制来挖掘 FILE 的缓冲区并将其写入磁盘。因此,您很容易遗漏日志文件的最后 5-10 行。对于像财务软件这样的软件,错误可能会导致数十亿美元的损失,而您不希望任何错误出现两次,因此需要大量的日志记录,这将是糟糕的。

至少那是 25 年前的立场。我很好奇这些天情况是否发生了变化?例如,是否存在一种机制,即使在 SEGV 或其他东西之后,操作系统也会告诉标准 C 库刷新输出缓冲区?如果是这样,那么 FILE 突然看起来好多了:没有可靠性的速度。 Plauger 在他 1992 年关于标准 C 库的书中提到,理论上 write() 也可以是某种缓冲函数而不是系统调用。

问题的一部分是:Windows 或 Linux 上是否有任何编译选项会影响这种权衡?比如说,不仅仅是 -O2,还有在核心转储时实际影响缓冲区刷新的选项?

这不是关于什么是允许的理论问题,而是关于今天和即将到来的 Linux 和 Windows 的实际问题。虽然我知道有问题的各种标准会 promise 某种或其他级别的可靠性或性能,但通常这些标准会被削弱到无用的程度,因为它们试图涵盖罕见的情况,例如 C 解释器或在 80 年代的 Cray 上运行的代码,或者其他的东西。此外,虽然我可以(并且正在)自己测试这个,但我的问题比今天的软件给我的默认编译选项更广泛。

最佳答案

事情没有改变。 CRT 和 OS 内核仍然是独立的王国。并且没有这样的选项会影响这一点。你必须用特殊的方法照顾好自己。提示:查看内存映射文件。

关于c++ - 对于从 C++ 编写敏感日志文件,文件描述符上的 write() 或文件上的 fprintf() 哪个更好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58480455/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com