好长一段时间,都没弄明白dup2(int oldfd, int newfd), 到底是从哪里复制到哪里,主要是《unix环境高级编程》一书翻译的太差,
因为对我形成了长期的误导!以至于后来用到管道的时候还时有迷惑,现在终于弄清楚了,因为要记下来,有不对的地方,还请
各位好友不吝赐教。
int dup2(int oldfd, int newfd);
这个是该函数的原型:复制一个文件描述符,并把新得到的文件描述符返回。
正常情况下,该函数会返回newfd, 比如 dup2(fd, 10), 则返回10
那么该函数不是复制文件描述符么,它复制的谁呢,当然是oldfd, 复制给谁,给newfd,那么newfd的数值变了吗?
比如int newfd = 10;
dup2(STDIN_FILENO, newfd); 大家知道这个newfd当然是变不了的(传个值进去,能变才怪),那么这到底是什么意思呢?
此时newfd和STDIN_FILENO都指向STDIN_FILENO,即标准输入,这个时候就可以关闭STDIN_FILENO了(如果不用的话)。
再比如
11 int fd2 = open("./2.c", O_RDWR);
12 if (fd2 == -1)
13 {
14 printf("cannot open ./2.c!\n");
15 return -1;
16 }
17
18 int fd = dup2(fd2, STDOUT_FILENO);
这个时候,STDOUT_FILENO被修改为fd2所描述的文件,也即./2.c
这个时候再调用printf等函数打印到标准输出,在屏幕上是看不到输出的,都定向到./2.c文件里了。