弄懂dup2函数

好长一段时间,都没弄明白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文件里了。

 

 


 

你可能感兴趣的:(编程,unix)