fork()后execv()的回声问题

时间:2012-06-18 13:24:05

标签: c linux unix fork

AFAICS,子进程从fork()上的父进程继承stdout / stdin。这让我想知道为什么以下代码不起作用:

int main(int argc, char *argv[])
{
    char *earg[] = {"echo", "Hello", NULL};

    if(fork() == 0) {
        printf("running echo...\n");
        execv("echo", earg);
        printf("done!\n");
        exit(0);
    } else {
        sleep(2);
    }

    return 0;
}   

运行这个小程序时,两个printf()调用在控制台上显示正常。但回声的呼唤不知何故迷路了!控制台上的输出只是:

running echo...
done!

有人可以向我解释为什么回声输出没有出现在控制台上?我怎么解决这个问题?

2 个答案:

答案 0 :(得分:3)

自您printf("done")被调用后,execv()显然失败了。所有exec()函数仅在发生错误时才返回。评估errno应该可以帮助您找出失败的原因。

尝试使用echo的整个路径:

 execv("/bin/echo", earg);

编辑:如果您想在孩子退出后立即打印done,则应向您的父母添加wait(NULL)电话。有关更多信息,请参阅wait()的联机帮助页以及如何使用它的示例。

答案 1 :(得分:2)

execv将不会在PATH中搜索echo命令,因此它会失败,并打印出"done"(如果execv成功则不会发生这种情况)。您必须提供execv工作的完整路径

您可能希望改用execvp。它将在PATH变量中搜索echo命令。