2016-09-22 26 views
0

重新導向的標準輸出與closeopenDUP2 VS緊密+開放標準輸出重定向

close(STDOUT_FILENO); 
int fd = open("log", O_RDWR); 
printf("My output\n"); 

從重定向不同通過dup2

int fd = open("log", O_RDWR); 
dup2(fd, STDOUT_FILENO); 
printf("My output\n"); 

strace我看到的是,在第一種情況下write返回EBADF

$ strace -e write ./a.out 
write(1, "My output\n", 10)  = -1 EBADF (Bad file descriptor) 

dup2如何區別於open + close

回答

0

當你

int fd = open("log", O_RDWR); 

打開文件可以是任何文件描述符。僅僅因爲你關閉了STDOUT_FILENO並不意味着它將用於open()。即使系統選擇了第一個可用的描述符(但不能保證),它仍然有可能:

  • stdin也關閉,並且會首先被選中。
  • 信號在close()open()之間運行,信號處理程序打開一個文件。
  • open()失敗,留下一個封閉的標準輸出。

另一方面,dup2()版本通過明確規定確保文件描述符是正確的。另外,dup2()保證是原子的。也就是說,在任何時候,STDOUT_FILENO都是有效的,要麼是舊的,要麼是新的,舊的已經關閉。

作爲旁註,在dup2之後,兩個描述符號碼都指向同一個文件,並且都需要close() ed。所以,如果你只是重定向標準輸出,你可能想在dup2()之後撥打close(fd)

+0

我問過這個問題,確認'open'返回的'fd'等於'STDOUT_FILENO'。信號的傳遞是可能的,但事實並非如此。既然你沒有一個場景在這裏,那麼這兩種方法有什麼不同呢? – MirkoBanchi