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!
有人可以向我解释为什么回声输出没有出现在控制台上吗?我该如何解决这个问题?
最佳答案
由于您的 printf("done")
被调用,您的 execv()
显然失败了。所有 exec()
函数只在发生错误时返回。评估 errno
应该可以帮助您找出失败的原因。
尝试使用整个路径来echo
:
execv("/bin/echo", earg);
编辑:如果您想在 child 退出后立即打印done
,您应该向您的 parent 添加一个wait(NULL)
调用。请参阅 wait()
的联机帮助页了解更多信息以及如何使用它的示例。
关于c - fork() 之后 execv() 的 Echo 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11083866/