为什么 printf 在 exevp 前面无法运行?

5
我得到了一个“hi!”的输出。为什么它没有打印出“something”?
#include <stdio.h>
#include <unistd.h>

int main(int argc, char** argv) {
    char* program_name = "echo";
    char* args[]= {program_name,"hi!",NULL};

    printf("something");
    execvp(program_name,args);
    return 0;
}

我知道我没有首先创建子进程。如果我去掉execvp行,它会按预期工作。奇怪的事情。(注意:"echo"指的是https://en.wikipedia.org/wiki/Echo_(command))

1个回答

8

字符串在io缓冲区中 - 所以拉动链条并刷新该缓冲区。

即,添加

fflush(stdout)

printf后面添加(或在printf中加入\n


我想补充一下,为了完全回答这个问题,printf确实在运行,只是它不会刷新缓冲区,因为stdout的标准缓冲模式是行缓冲,所以只有在出现换行符时才会自动刷新。尽管如此,@andrew_ghobrial,它回答了你的问题,建议接受它。 - user2371524
为了进一步澄清@FelixPalmen所提到的内容并扩展此答案:对于终端(或伪终端)设备(以及一般的任何交互式设备),stdio是行缓冲的,并且对于其他文件类型(管道,常规文件等),则是完全缓冲的。因此,如果输出被重定向到不是交互式设备的某个地方,则添加\n是不够的;您必须使用fflush(3)显式刷新缓冲区。 - Filipe Gonçalves

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接