2012-09-24 57 views
1

我正在學習poll,select和類似的功能,我一直在困擾的聲明「會阻止」(這顯示了我正在閱讀的有關Linux的建築驅動程序的書,也在pollselect的手冊頁上)。我真的不明白這一點。什麼會被阻止?讀/寫文件描述符的過程?讀/寫操作本身,就是說當前進程正在讀/寫時,沒有其他進程能夠讀/寫該文件?民意調查,選擇和「將阻止」

如果這是一個愚蠢的問題,我很抱歉,但我很難找到任何地方的這個問題的答案。

回答

3

該塊意味着進行系統調用的進程會阻塞(等待),直到系統調用返回。例如,如果要求程序讀取文件,則在發出讀取命令後,程序將等待(阻止),直至操作系統執行讀取並將結果返回給程序。

關於訪問同一文件的多個程序,多個進程可以讀取同一個文件。但是,當一個或多個進程正在寫入具有一個或多個進程讀取同一文件的文件時,您可以(並且通常會)具有競爭條件。換句話說,阻塞是關於訪問文件的單個進程,並且不保證訪問同一文件的兩個進程之間的操作順序(例如讀取和寫入)。 (由於某些原因,我正在考慮文件;管道和套接字的讀/寫特性與文件系統上的文件的讀/寫特性明顯不同)。

+0

雖然我在上面提到的文件中,主要用來輪詢,選擇等是對於像的對象,如文件插座和管道。試圖從套接字讀取的進程A將阻塞(等待),直到另一個進程寫入該套接字爲止。然而,A的讀取阻塞不會影響其他任何進程對該套接字的寫入或讀取(即使A從該套接字讀取時被阻塞,其他進程仍然可以讀取和寫入該套接字)。 –

+0

顯然,我對ZeroMQ的想法太多了。套接字和管道位於成對進程之間。 –

2

除了傑夫斯正確答案:

你可以,但是,使用這些大多數系統調用在非阻塞的方式,如果你打開非阻塞模式(O_NONBLOCK)對應的文件描述符。 該調用總是立即返回,但是如果失敗,它會返回EWOULDBLOCK的errno(並且沒有有效數據),並且您需要在應用程序或驅動程序中自行處理。

1

讓我換一種方式。

1)正常I/O是「阻塞」。您發出「讀取」,並且您的程序「等待」,直到數據到達或發生錯誤(或超時)。

2)非阻塞I/O是「不同的」。你需要一些方法來判斷你是否「完成」。

3)對於「閱讀」,EWOULDBLOCK說「沒有任何數據」。這是說「如果這是'正常的I/O',那麼我會阻止」。

4)對於「寫入」,EWOULDBLOCK在說​​「第一個緩衝區尚未完全發送並確認 - 您可能想在發送其他任何內容之前暫緩。」

兩個鏈接: