c - POSIX 中的 fopen 与 open(C 语言)

标签 c io posix fopen

此后question ,一个疑问出现了:

一旦fopen()open()更快(至少对于顺序写入/就绪操作),前者是一个库,后者是一个系统调用,fopen() 在 POSIX 兼容操作系统中执行什么系统调用?

最佳答案

它调用open

fopen 本身并不比 open 快;不可能,它是开放加上一些额外的工作。链接问题中描述的性能优势来自于 FILE 对象在其整个生命周期中完成的“缓冲”。实际的优化是调用 write 原语更少次数,每次提供更多数据

这里有一个简单的方法来演示效果:编译这个程序。

#define _XOPEN_SOURCE 700
#include <stdlib.h>
#include <stdio.h>

int main(int argc, char **argv)
{
    if (argc != 3) return 1;
    long count = atol(argv[1]);
    long chunk = atol(argv[2]);
    if (count < 1 || chunk < 0) return 1;

    FILE *sink = fopen("/dev/null", "wb");
    if (!sink) return 1;

    if (chunk) {
        char *buf = malloc(chunk);
        if (!buf) return 1;
        if (setvbuf(sink, buf, _IOFBF, chunk)) return 1;
    } else {
        if (setvbuf(sink, 0, _IONBF, 0)) return 1;
    }

    while (count--) putc_unlocked('.', sink);
    return 0;
}

它有两个参数:要写入的字节总数,以及输出缓冲区的大小(按顺序)。使用不同的参数值运行它并对其性能进行计时;你应该看到,例如

./a.out $((1024*1024*128)) 1

慢得多
./a.out $((1024*1024*128)) 8192

第一个数字需要非常大才能测量差异。一旦你玩了一段时间,运行

strace ./a.out 50 1

strace ./a.out 50 50

了解系统调用级别发生的情况的差异。 (如果您使用的是 Linux 以外的操作系统,请将 strace 替换为该操作系统的等效命令。)

关于c - POSIX 中的 fopen 与 open(C 语言),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69571016/

相关文章:

c - 如何在C中将数组初始化为全0?

c - rewind() 之后,您可以使 fprintf() 写入文件末尾吗(例如完全覆盖)

python - TensorFlow 检查点保存和读取

shell - 为什么\$ 在反引号内减少到 $ [虽然不在 $(...)] 内?

unix - 出于共享的目的,何时将共享库视为 "the same"?

c++ - Win API,每 X 秒更新一次静态控件

C: sscanf 问题

c - 设置 MACRO 的范围

java - 使用内存中的字节数组(没有物理文件)创建 Java File 对象(或等效对象)

shell - shell 的 `source` 是 POSIX 标准的吗?