我关闭管道后为什么要execlp?

时间:2014-02-27 16:33:10

标签: c linux pipe

您可以解释为什么我在关闭管道后应该使用execlp吗?

以下是一个例子:

if( cid == 0)
{//Only child cid can run this code

    char msg[256];

    //Redirect output into the pipe instead of the terminal
    dup2(pipe1Fds[1],STDOUT_FILENO);

    //Close pipes or the pipe reader will not get an EOF
    close(pipe1Fds[0]);
    close(pipe1Fds[1]);
    close(pipe2Fds[0]);
    close(pipe2Fds[1]);

    //Execute cmd1
    execlp(cmd1,cmd1,(char *)0);

    exit(0);
}

2 个答案:

答案 0 :(得分:1)

你有dup2来自STDOUT FD的FD管道,所以你不再需要它了,需要关闭它(所以它有一个EOF供读者使用)。

execlp执行的程序(如果有输出)认为它写入STDOUT,但STDOUT FD已更改为管道FD,因此写入管道FD。

答案 1 :(得分:1)

execlp()将在此过程中加载不同的代码,然后运行新程序,因此在加载目标代码之前需要关闭管道,因为目标代码不会访问管道。
您可以阅读此内容以获取更多信息link。由于你的代码将被execlp()加载的程序取代,你必须在调用execlp()之前关闭管道。