为什么我没有看到 printf 缓冲区刷新?

use*_*192 4 c printf stdout execvp output

我有一个简单的程序(工作示例):

#include <unistd.h>
#include <stdio.h>

int main() {
  pid_t my_pid = getpid();
  char str[30];

  sprintf(str, "/proc/%d/fd", my_pid);
  printf("hello, I am gonna print out: %s", str);

  execvp( "ls", (char *[]) { "ls", str, NULL } );

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

在 Linux VM 上用 gcc 编译。我的问题是为什么发送到的输出printf永远不会打印。

我知道printf缓冲其输出并且仅刷新\n. 我想知道为什么在这种情况下它不打印。我读到输出流在程序退出时被刷新。正在一块内存printf中缓冲输出(我在实现中确认了这一点)。malloc

我对此的疑问(欢迎更多详细信息):

  • 为什么注释掉调用会execvp导致输出打印在 上stdout,但它没有按原样打印?ls我的想法是,即使在蚕食进程之后,它是否仍然被认为是程序退出?
  • printf的内存缓冲区会被视为输出流吗?
  • 与这个问题完全不相关的细节是我想知道为什么我的进程不继承10文件描述符。zsh255bash

ana*_*lyg 5

execvp用新流程替换旧流程。任何打开的文件描述符都保持打开状态,但不会保留 C stdio 库缓冲的数据。C 启动代码会将新的 FILE 指针附加到 STDOUT 文件描述符。关键是文件描述符是操作系统对象,而FILE指针是 C 库对象。仅保留操作系统对象。