2014-01-31 109 views
1

有一件事我想知道在Unix和類Unix系統(如BSD,GNU/Linux等)上是否有辦法做到這一點。我不在乎是否必須使用標準C I/O或低級別的Unix I/O接口,因爲在這一點上,我還沒有足夠的承諾爲此目的而使用其中之一。簡而言之,如果一個界面允許我這樣做,另一個界面不允許,那麼我會選擇這個界面。有沒有辦法在POSIX C中做到這一點?

無論如何 - 這就是我想要做的。我有一個輸入文件流(再一次,不關心它是一個ANSI「FILE」結構還是一個Unix文件描述符),我想檢查這個流是否有任何數據等待讀取 - - 但這裏有一個 - 如果有沒有等待被讀取的數據,但是稍後有可能會有更多這樣的數據進入(比如如果在這個文件流的另一端是另一個程序我與intereacting)我只是希望我的程序能夠知道,有沒有數據可用,所以它可以繼續進行其他操作,並檢查回來,看是否有數據已經來到了(相對於只是在等待更多信息的同時凍結我的程序)。

而且,如果沒有數據等待讀----我想知道是否有任何機會後更可能出現在(即是如果在文件流的另一端是另一種程序,它可能發送更多數據到流)---或者如果有有更多數據進入的可能性(即如果文件流的另一端的程序終止或關閉文件流就結束了---或者如果文件流引用實際文件)。

那麼,有什麼辦法可以在Unix系統的C上做到這一點?如果是這樣,怎麼樣? (再一次,在這一點上,我並不關心我是使用ANSI C標準I/O還是必須使用低級Unix I/O)。

+1

您可能想要閱讀諸如select(),epoll()和非阻塞I/O等內容。 –

+2

查找'O_NONBLOCK'。 – duskwuff

+0

簡單的可能'recv' –

回答

2

你所描述是readnon-blocking模式文件的標準行爲。

如果沒有數據讀取它將返回-1,並將errno設置爲EAGAIN。然後你可以去做一些其他的事情。

如果有數據需要讀取,它會返回多少讀數。

如果沒有讀更多的數據(因爲對文件或一個管或諸如此類的東西的寫入結束的閉合EOF)的可能性,然後返回0。

可以設置非阻塞模式或者作爲參數open或通過fcntl

+0

非常感謝您---然後在情況下,我將使用低級別的Unix I/O。 :-) 謝謝。 :-) –

+0

請注意,有時您可能需要從多次讀取中追加數據,然後才能獲取足夠的數據來執行某些操作。 – Dmitri

相關問題