管道與重定向經常須要使用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