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

问题描述 投票:0回答:0

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

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

int main() {
  pid_t = 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;
}

在 Linux VM 上使用 gcc 编译。我的问题是为什么发送到

printf
的输出从不打印。

我知道

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

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

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

谢谢你的时间。

c output printf stdout execvp
© www.soinside.com 2019 - 2024. All rights reserved.