您可以解释为什么我在关闭管道后应该使用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);
}
答案 0 :(得分:1)
你有dup2
来自STDOUT FD的FD管道,所以你不再需要它了,需要关闭它(所以它有一个EOF供读者使用)。
由execlp
执行的程序(如果有输出)认为它写入STDOUT,但STDOUT FD已更改为管道FD,因此写入管道FD。
答案 1 :(得分:1)
execlp()将在此过程中加载不同的代码,然后运行新程序,因此在加载目标代码之前需要关闭管道,因为目标代码不会访问管道。
您可以阅读此内容以获取更多信息link。由于你的代码将被execlp()加载的程序取代,你必须在调用execlp()之前关闭管道。