[apue] dup2的正確打開方式
管道與重定向常常需要使用dup與dup2復(fù)制句柄,其中dup2又較為常用,但是使用dup2有幾個(gè)小坑需要注意。
int dup2(int oldfd, int newfd);
man手冊(cè)頁上是這樣講的,oldfd是想要復(fù)制的句柄,newfd是復(fù)制到的句柄號(hào),如果newfd已經(jīng)打開,dup2會(huì)先嘗試關(guān)閉,
復(fù)制完成后,oldfd與newfd都將指向同一文件實(shí)例。一般需要close(oldfd)來減少不必要的引用。所以一般人可能會(huì)這樣寫代碼:
1 if (dup2 (oldfd, newfd) != -1) 2 close (oldfd);
但是有個(gè)例外的情況,就是oldfd==newfd,照man手冊(cè)頁上講,此時(shí)dup2將什么也不做,直接返回成功。
此時(shí)oldfd與newfd相同,而close(oldfd)將導(dǎo)致文件的唯一引用被關(guān)閉,后續(xù)的操作可想而知也會(huì)失敗。
所以萬無一失的dup2使用方法是這樣:
1 if (oldfd != newfd) { 2 if (dup2 (oldfd, newfd) != -1) 3 close (oldfd); 4 }
本文來自博客園,作者:goodcitizen,轉(zhuǎn)載請(qǐng)注明原文鏈接:http://www.rzrgm.cn/goodcitizen/p/right_way_to_use_dup2.html
浙公網(wǎng)安備 33010602011771號(hào)