[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

相關文章
相關標籤/搜索