O NONBLOCK與O NDELAY有何不同

2021-06-27 12:26:01 字數 694 閱讀 2068

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時設定。

如果沒有資料,那麼該呼叫將被阻塞.處於等待狀態,直到有字元輸入,

或者到了規定的時限和出現錯誤為止,

通過以下方法,能使read函式立即返回。

fcntl(fd,f_setfl,fndelay);

fndelay 函式使read函式在埠沒月字元存在的情況下,立刻返回0,

如果要恢復正常(阻塞)狀態,可以呼叫fcntl()函式,不要fndelay引數,

如下所示:

fcntl(fd,f_setfl,0);

在使用o_ndelay引數開啟序列口後,同樣與使用了該函式呼叫。

fcntl(fd,f_setfl,0);

O NONBLOCK與O NDELAY有何不同?

o nonblock和o ndelay所產生的結果都是使i o變成非擱置模式 non blocking 在讀取不到資料或是寫入緩衝區已滿會馬上return,而不會擱置程式動作,直到有資料或寫入完成。它們的差別在於設立o ndelay會使i o函式馬上回傳0,但是又衍生出乙個問題,因為讀取到檔案結尾時...

SQL與NoSQL MySQL與NoSQL的融合

寫這一篇內容的原因是mysql5.6.2突然推出了memcached的功能。nosql to innodb with memcached的出現,可以看出nosql對關聯式資料庫的確產生了巨大的影響,個人覺得這是乙個非常大的進步,可以讓開發人員更加方便的使用nosql和關聯式資料庫。nosql一般被認...

指標與陣列 a與 a區別

假設宣告了乙個陣列a,則 a表示陣列a的首位址,a與 a 0 表示陣列a首元素的首位址,那麼 a 1與a 1有哪些區別呢?通過下面的實驗來說明。int i 0 int a 5 int p int a 1 for i 0 i 5 i printf a 0x p,a 0x p,a 1 0x p n a,...