Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/css/32.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 何时以及为什么我必须关闭管道?_C_Pipe - Fatal编程技术网

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)现在引用它
  • 该进程已经分叉,子进程在关闭自己的管道文件描述符之前复制管道的读取端。这意味着在子进程中,管道的读取端也保持打开状态
我们不必关闭管道的原始管道文件描述符。然而,关闭我们不需要的文件描述符通常是一种很好的做法,这就是这个程序所做的。多个文件描述符可以引用同一管道(或文件或其他实体),管道/文件/任何内容本身都不会关闭,直到引用它的所有文件描述符都关闭

另外,值得注意的是,如果管道的写入端关闭(意味着引用它的所有打开的文件描述符都关闭),管道的读取端将只看到“文件结束”条件(即have
read
return 0)