2013-04-29 50 views
2

所以,我一直在閱讀關於select和poll手冊頁,但不幸的是,我仍然對某些事情感到困惑。如果有人能爲我回答以下問題,這將很好:Linux中的select()和poll()

  • 當非阻塞模式打開文件時會發生什麼? (O_NONBLOCK標誌被設置)
  • 當有數據是緩衝區時,read()阻塞或返回什麼?
  • 當緩衝區中沒有任何數據要讀取時會發生什麼?

回答

3

當文件以非阻塞模式打開時會發生什麼? (O_NONBLOCK 標記被設置)

  • 如果文件不能立即打開,open()返回一個錯誤而不是阻塞的,開放的()可以僅阻止與FIFO中。
  • 如果open()成功,則所有IO操作都將是非阻塞的。這意味着,如果IO操作不能立即完成,將會部分執行,否則會失敗(EAGAIN或EWOULDBLOCK)。

當有數據是緩衝區時,read()阻塞或返回什麼?

  • 阻塞和非阻塞的讀取之間的差值()當不存在要讀取的數據進行。因此,當緩衝區中有數據時,非阻塞read()會返回它。

而當緩衝區中沒有任何數據要讀取時會發生什麼?

  • 如果沒有數據,非阻塞讀()與EAGAIN錯誤返回。
3

當在一個文件中非阻塞模式下打開,會發生什麼? (設置了O_NONBLOCK標誌)

I/O操作不會阻塞,而是返回一個錯誤代碼,指示它們將被阻塞。

當有數據是緩衝區時,read()阻塞或返回什麼?

當緩衝區中有數據時,read返回它。

當沒有在緩衝區中的所有數據讀取時會發生什麼?

如果套接字被阻塞,它將阻塞,直到可以返回一些數據。如果套接字是非阻塞的,它將返回一個錯誤代碼,指示在套接字被阻塞時它將被阻塞。

順便說一句,selectpoll的一個重要警告 - 它們應該幾乎從不用於阻塞套接字。當您從selectpoll中獲得讀取或寫入命中時,這意味着您在調用函數時以及返回時不會阻止的某個時間在中間執行的假設的規範操作。這些是狀態報告功能,不提供未來保證。如果您正在編寫一個永遠不會阻塞的程序,則它必須將其所有套接字設置爲非阻塞狀態。

相關問題