旗標O_NONBLOCK與O_NDELAY有何不同?

O_NONBLOCK和O_NDELAY所產生的結果都是使I/O變成非擱置模式(non-blocking),在讀取不到資料或是寫入緩衝區已滿會馬上return,而不會擱置程式動作,直到有資料或寫入完成。

它們的差別在於設立O_NDELAY會使I/O函式馬上回傳0,但是又衍生出一個問題,因為讀取到檔案結尾時所回傳的也是0,這樣無法得知是哪中情況;因此,O_NONBLOCK就產生出來,它在讀取不到資料時會回傳-1,並且設置errno為EAGAIN。

不過需要注意的是,在GNU C中O_NDELAY只是為了與BSD的程式相容,實際上是使用O_NONBLOCK作為巨集定義,而且O_NONBLOCK除了在ioctl中使用,還可以在open時設定。

參考資料

留言