POSIX 中的 fopen 与 open(在 C 中)

fopen vs open (in C) in POSIX

经过这个question,一个疑问出现了:

一旦 fopen()open() 快(至少对于顺序 writing/ready 操作),前者是库,后者是系统调用,fopen() 在 POSIX compilant OS?

中执行什么系统调用

它调用open

fopen本身并不比open快;不可能,它是 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

了解系统调用级别的差异。 (如果您使用 OS 而不是 Linux,请将 strace 替换为 OS 的任何等效命令。)