1

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() 调用在控制台上显示得很好。但是对 echo 的调用不知何故丢失了!控制台上的输出只是:

running echo...
done!

有人可以向我解释为什么控制台上没有显示回显输出吗?我该如何解决这个问题?

4

2 回答 2

4

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

尝试使用整个路径echo

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

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

于 2012-06-18T13:27:17.613 回答
3

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

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

于 2012-06-18T13:28:08.513 回答