c - C 标准库中的任何函数是否隐式使用 `stderr` ?

标签 c glibc stderr libc c-standard-library

C 规范要求所有 C 程序都打开 3 个流并可供它们使用:stdout , stdin , stderr .
用户可以按照他们认为合适的方式使用这些流,例如:

fprintf(stdout, "lol");
fputs("oops", stderr);
fgets(buffer, 20, stdin);
C 标准库中的一些函数隐式使用这些,例如:
printf("lol");           /* implicitly uses stdout */
puts("rofl");            /* implicitly uses stdout */
int c = getchar(buffer); /* implicitly uses stdin  */
  • 任何 C 标准库中的函数隐式使用 stderr ?
  • 任何 C 标准库(例如 Linux 上的 GNU 的 glibc)的常见实现中的函数隐式使用 stderr ?
  • 最佳答案

    assert宏和perror函数写入标准错误流。 abort_handler_s也是如此功能(在可选附件 K 中)。exit关闭文件并刷新流,因此它隐式作用于标准错误流。 _Exitabort可以这样做; C 标准允许但不要求它。 fflush(NULL)刷新所有流。
    C 2018 7.21.3 3 描述了输入和输出流之间的一些交互:在非缓冲流或行缓冲流上请求输入并且需要来自主机环境的字符,然后刷新行缓冲流。这可能会影响标准错误流。
    根据 C 2018 Annex J(可选),C 实现可能会将一些浮点诊断写入标准错误流,作为正常程序终止的一部分。
    在 C 2018 标准中搜索“标准错误流”和“stderr”不会揭示标准库中标准错误流的任何其他隐式用途。

    关于c - C 标准库中的任何函数是否隐式使用 `stderr` ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65615335/

    相关文章:

    c - getaddrinfo 目的地址选择逻辑

    c - 查找表,其内容取决于整数类型的大小

    c - 在 c 中使用 rpc 将字符串作为参数传递

    c - 计算所选单词的字符数的程序

    glibc -/lib/ld-linux.so.2 : bad ELF interpreter: No such file or directory

    c# - mkbundle 生成的程序(来自 C# 程序)在 Ubuntu 上运行,但在 Redhat 上不起作用

    python - 程序输出既不是 STDOUT 也不是 STDERR?

    python - 在 subprocess.check_call 中捕获 stderr 而不使用 subprocess.PIPE

    c语言: read file content as numbers and add them together