我只是想了解管道,我正在研究一个例子:
#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;
}
Run Code Online (Sandbox Code Playgroud)
我不明白为什么这段代码在使用之前关闭了pipefd.
为什么在这里关闭?
dup2(pipefd[1], 1);
close(pipefd[0]);
close(pipefd[1]);
Run Code Online (Sandbox Code Playgroud)
这会将管道写入端的文件描述符复制到文件描述符#1,它对应于stdout - 程序正常输出将到达.然后它关闭管道两端的原始文件描述符,但是:
我们不必关闭管道的原始管道文件描述符.但是,通常最好关闭我们不需要的文件描述符,这就是该程序的作用.多个文件描述符可以引用相同的管道(或文件或其他实体),并且管道/文件/其自身在关闭所有引用它的文件描述符之前不会关闭.