我只是想了解管道,我正在做一个例子:
#define _XOPEN_SOURCE 700
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
int main()
{
pid_t p;
int status;
int pipefd[2];
pipe(pipefd);
p = fork();
if(p == 0)
{
dup2(pipefd[1], 1);
close(pipefd[0]);
close(pipefd[1]);
execlp(argv[1], argv[1], NULL);
perror(argv[1]);
exit(1);
}
dup2(pipefd[0], 0);
close(pipefd[0]);
close(pipefd[1]);
execvp(argv[2], argv+2);
perror(argv[2]);
return 1;
}
我不明白为什么这段代码在使用之前会关闭pipefd。
为什么这里要关门?
最佳答案
dup2(pipefd[1], 1);
close(pipefd[0]);
close(pipefd[1]);
这与管道到文件描述符1的写入端的文件描述符重复,后者对应于标准输出,程序正常输出将指向标准输出然后关闭管道两端的原始文件描述符,但是:
管道本身的写端不会关闭,因为另一个打开的文件描述符(1)现在引用它
进程已经分叉,子进程在关闭自己的管道文件描述符之前,同样地复制管道的读取端。这意味着在子进程中,管道的读取端也处于打开状态。
我们不必关闭管道的原始管道文件描述符然而,关闭我们不需要的文件描述符通常是一个好的实践,这就是这个程序所做的多个文件描述符可以引用同一个管道(或文件或其他实体),管道/文件/任何内容本身都不会关闭,直到引用它的所有文件描述符都关闭。