[apue] dup2的正确打开方式

管道与重定向经常须要使用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

相关文章
相关标签/搜索