【问题标题】:Why is printf before exevp not running?为什么exevp之前的printf没有运行?
【发布时间】:2015-12-09 10:27:42
【问题描述】:

我得到“嗨!”的输出。为什么这也不打印“某物”?

#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)

【问题讨论】:

    标签: c unix exec system-calls


    【解决方案1】:

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

    即添加

    fflush(stdout)
    

    printf 之后(或将\n 添加到printf

    【讨论】:

    • 我想补充一下,为了完全回答这个问题,printf 确实正在运行,它只是不刷新缓冲区,因为标准缓冲模式stdout行缓冲,所以自动刷新只发生在换行符处。不过,@andrew_ghobrial,它回答了你的问题,所以建议接受它。
    • 为了进一步澄清@FelixPalmen 提到的内容并扩展这个答案:stdio 是针对终端(或伪终端)设备(通常是任何交互式设备)进行行缓冲的,并且是完全缓冲的对于其他文件类型(管道、常规文件等)。因此,如果输出被重定向到非交互式设备,添加\n 是不够的;您必须使用fflush(3) 显式刷新缓冲区。
    猜你喜欢
    • 2012-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-16
    • 2020-04-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多