int* STDIN_FILENO = (int *)0; // 这是一个指向标准输入的指针,由系统预定义,所以可以直接拿来使用
// 下面这句的意思相当于:int* stdinp = STDIN_FILENO,
// 即使用stdinp和STDIN_FILENO指向同一个地方
int* stdinp = dup(STDIN_FILENO);
// 下面创建管道
int fd[2];
pipe(fd);
// 下面这句相当于:
// STDIN_FILENO = fd[0];
// 从这里可以看出STDIN_FILENO和stdinp指向了不同的位置
// 转载者注:这里为什么它们指向了不同的位置呢,因为int dup2(int oldfd, newfd)函数
// 在复制oldfd给newfd之前,会执行close(newfd)的命令
dup2(fd[0], STDIN_FILENO);
// 在这里可以关闭fd[0],因为我们还可以通过STDIN_FILENO
// 来操作这块内存,原因是STDIN_FILENO和fd[0]是指向同一个地方的
// 所以通常会:
close(fd[0]);
// 以后STDIN_FILENO可以替代fd[0]了,close(fd[0])相当于
// fd[0] = NULL;
// 将fd[0]指向一个有效的安全值,关闭它
// 下面再说说如何恢复:
// 只需要执行:
dup2(stdinp, STDIN_FILENO);
// 这又使用STDIN_FILENO和stdinp指向了相同的地方,由于stdinp实际上是指向最原始的“STDIN_FILENO”的,
// 所以相当于恢复了指向
// 由于STDIN_FILENO和stdinp现在又都指向了相同的地方,所以stdinp已经完成历史使命,这个时候可以关闭它了:
close(stdinp);
// 这个当然相当于:
stdinp = NULL;
pipe 的概念与使用
你觉得这篇文章怎么样?
YYDS
比心
酷
加油
菜狗
… views
Loading Comments...