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