next up previous
Next: 要怎樣才能得知一個已 open 檔案之檔名? Up: 自以為已經知道所有答案的人可能會問的高級問題 Previous: 要如何在使用者不必按 RETURN 的情況下從 terminal 讀進東西?

我要如何在未曾真的讀進東西的情況下檢查是否有字元等待讀取?

某些版本的 UNIX 提供了檢查某個 file descriptor 目前是否有東西待讀取的 方法。在 BSD 中,可以用 "select(2),也可以用 FIONREAD ioctl,檢查有幾 個字元等待讀取,不過這只對 terminal, pipe, 與 socket 有用。在 System V Release 3 中可以用 poll(2),不過只對 stream 有用。在 Xenix 與 Sys V r3.2 及其以後的版本裡,有一個名叫 rdchk() 的 system call 可以用來檢查 對一個 file descriptor 做 read() 會不會卡住。

沒有方法可以用來判斷是否有字元在 FILE pointer 中待讀取。(你可以直接查 看 stdio 的資料結構,看看是否 input buffer 是空的,但是這方法有時會失 效,因為你沒有辦法知道當你下一次要填滿這個 buffer 時會發生什麼事。)

有時人們問這個問題是因為想寫

		if (characters available from fd)
                    read(fd, buf, sizeof buf);
以達成 nonblocking read。這不是一種好的做法,因為可能測的時候有東西, 要讀的時候,已經沒有東西可讀了。正確的做法應該是用 fcntl(2) 裡的  F_SETFL 設定 O_NDELAY。在一些比較舊的系統 (例如: Version 7, 4.1 BSD) 裡,並沒有  O_NDELAY 可用,就得用 alarm(2) 來設定 read 的 timeout,以達成近似  nonblocking read 的功能。



Tan Koan-Sin
1999-03-02