2011-12-09 71 views
1

我有C中的功能,假設標準輸入打開。我想在它前面添加一個斷言來確保任何人都不關閉stdin。我如何檢查標準輸入未被任何人關閉?斷言標準輸入打開

assert(is_open(stdin)); 
+2

爲什麼你會關注這個 - 是什麼讓你覺得代碼中的其他東西足夠愚蠢的關閉stdin? –

+0

@JonathanLeffler我在一家公司工作。可以編寫一個函數A(),它在完成時打開和關閉一個文件。其他一些程序員可以將STDIN作爲參數傳遞。如果我的函數在A()函數後被調用,它將不會找到STDIN。這就是爲什麼。 –

+0

@DanParadox:那麼你的同事應該採用一個函數應該關閉一個'FILE *'的原則,當且僅當它打開它。 –

回答

4

您無法確定FILE*是否已關閉。 fclose可能freeFILE它指向的對象,因此在fclose之後對象的內容可能未定義。即使是stdin也是如此。我之前提出的解決方案是錯誤的。對於那個很抱歉。

您可以在POSIX平臺上做的最好的是一樣的東西

bool stdin_open() 
{ 
    errno = 0; 
    fcntl(STDIN_FILENO, F_GETFD); 
    return errno == EBADF; 
} 

但真正告訴你一些有關標準輸入FD,而不是stdin對象。

相關問題