管道与重定向经常须要使用dup与dup2复制句柄,其中dup2又较为经常使用,可是使用dup2有几个小坑须要注意。git
int dup2(int oldfd, int newfd);github
man手册页上是这样讲的,oldfd是想要复制的句柄,newfd是复制到的句柄号,若是newfd已经打开,dup2会先尝试关闭,spa
复制完成后,oldfd与newfd都将指向同一文件实例。通常须要close(oldfd)来减小没必要要的引用。因此通常人可能会这样写代码:code
1 if (dup2 (oldfd, newfd) != -1) 2 close (oldfd);
可是有个例外的状况,就是oldfd==newfd,照man手册页上讲,此时dup2将什么也不作,直接返回成功。blog
此时oldfd与newfd相同,而close(oldfd)将致使文件的惟一引用被关闭,后续的操做可想而知也会失败。ip
因此万无一失的dup2使用方法是这样:get
1 if (oldfd != newfd) { 2 if (dup2 (oldfd, newfd) != -1) 3 close (oldfd); 4 }
样例代码it