如何检查输出流的缓冲区类型?

dom*_*son 5 c linux

使用setvbuf(),我们可以将流的缓冲区类型更改FILE*为以下之一:

  • _IONBF(无缓冲)
  • _IOLBF(行缓冲)
  • _IOFBF(完全缓冲)

例如,为了设置stderr为行缓冲,我们可以执行以下操作:

setvbuf(stderr, NULL, _IOLBF, 0);
Run Code Online (Sandbox Code Playgroud)

还有一种方法可以找出给定输出流的当前缓冲区类型(使用文件描述符或 FILE 指针)?

Kam*_*Cuk 3

这是不可能的。没有标准方法来确定打开的当前缓冲特性FILE

GNU C 库中提供了 Solaris 引入的非标准函数,GNU C 库中有一个函数__flbfstdio_ext.h如果流是行缓冲的,则返回非零值。

检查glibc 源libio/iosetvbuf.c后,您不应该使用的以下程序似乎可以在我的 GNU libc 2.31 平台上运行:

#include <stdio.h>

#ifdef __GLIBC__
#define _IO_UNBUFFERED        0x0002
#define _IO_LINE_BUF          0x0200
int getvbuf(FILE *f) {
    if (f->_flags & _IO_UNBUFFERED) {
        return _IONBF;
    } else if (f->_flags & _IO_LINE_BUF) {
        return _IOLBF;
    }
    return _IOFBF;
}
#else
#error This program works only with glibc.
#endif

const char *vbuf_to_str(int a) {
    switch (a) {
    case _IONBF: return "_IONBF";
    case _IOLBF: return "_IOLBF";
    case _IOFBF: return "_IOFBF";
    }
    return "unknown";
}

int main() {
    setvbuf(stderr, NULL, _IONBF, 0);
    printf("%s\n", vbuf_to_str(getvbuf(stderr)));
    setvbuf(stderr, NULL, _IOLBF, 0);
    printf("%s\n", vbuf_to_str(getvbuf(stderr)));
    setvbuf(stderr, NULL, _IOFBF, 0);
    printf("%s\n", vbuf_to_str(getvbuf(stderr)));
}
Run Code Online (Sandbox Code Playgroud)