C 何时以及为什么我必须关闭管道?
我试图理解管道,并正在制作一个示例:C 何时以及为什么我必须关闭管道?,c,pipe,C,Pipe,我试图理解管道,并正在制作一个示例: #定义_XOPEN_源700 #包括 #包括 #包括 int main(int argc,char*argv[]) { pid_t p; 智力状态; int-pipefd[2]; 管道(pipefd); p=fork(); 如果(p==0) { dup2(pipefd[1],1); 关闭(pipefd[0]); 关闭(pipefd[1]); execlp(argv[1],argv[1],NULL); perror(argv[1]); 出口(1); } du
#定义_XOPEN_源700
#包括
#包括
#包括
int main(int argc,char*argv[])
{
pid_t p;
智力状态;
int-pipefd[2];
管道(pipefd);
p=fork();
如果(p==0)
{
dup2(pipefd[1],1);
关闭(pipefd[0]);
关闭(pipefd[1]);
execlp(argv[1],argv[1],NULL);
perror(argv[1]);
出口(1);
}
dup2(pipefd[0],0);
关闭(pipefd[0]);
关闭(pipefd[1]);
execvp(argv[2],argv+2);
perror(argv[2]);
返回0;
}
我不明白为什么这段代码在使用之前会关闭pipefd
为什么我们在这里调用
close
?您已经用dup2
调用复制了描述符,因此子进程中不再需要pipefd[1]
描述符。在父进程中也是如此
事实上,描述符是一种有限的资源,如果您保持管道描述符的打开状态,那么流程中就少了两个可用的描述符
dup2(pipefd[1], 1);
close(pipefd[0]);
close(pipefd[1]);
这将管道写入端的文件描述符复制到文件描述符#1,它对应于标准输出,程序正常输出将指向标准输出。然后关闭管道两端的原始文件描述符,但是:
- 管道本身的写入端不会关闭,因为另一个打开的文件描述符(1)现在引用它
- 该进程已经分叉,子进程在关闭自己的管道文件描述符之前复制管道的读取端。这意味着在子进程中,管道的读取端也保持打开状态
read
return 0)