c - fork() 之后 execv() 的 Echo 问题

标签 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() 调用在控制台上显示得很好。但是 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/

相关文章:

linux - 将多个 SFTP 命令行转换为单行命令行

c - 当我不在父进程中等待子进程时,如何终止程序?

c - 获取整数输入并在没有数组的情况下逐行输出

c - 调试 c 中读取的 csv

linux - 使用 flock 锁定文件 X 时间

c - 初始化的字符数组指向同一内存

c++ - GetFullPathNameA 不返回 DLL 的路径

linux - ALSA - 使用 alsa api (linux) 在 c 代码中更改麦克风增益

linux - 利用导致程序在 GDB 中以不同的值退出?

linux - cp/rsync 命令,目标为目录的符号链接(symbolic link)