2013-02-05 86 views
4

我不明白如何讀取()系統塊。我創建了一個空文件並嘗試使用read()系統調用進行讀取。它返回0.如何阻止讀取系統調用

fd = open("Demo.txt",O_RDONLY); 
n = read(fd,&ch,10); // returns 0 

我期待read()無限期地阻塞,因爲文件中沒有數據。 read()是否將EOF視爲有效數據並立即返回?我的理解是否正確?

+0

如果它沒有返回EOF,你會怎麼知道你什麼時候讀完了?所有從文件中讀取的程序都會永久掛起。 – Barmar

回答

6

是的,EOF將導致read()立即返回,而不是阻塞。當您到達EOF時,read()不會等待更多數據寫入文件;它立即返回0字節。從磁盤文件讀取數據時,阻塞不起作用,除了磁盤上的數據讀入內存時通常不可察覺的延遲。

使用TTY,套接字和管道時,它更相關。例如,當標準輸入連接到終端時,從標準輸入讀取將會阻塞,直到用戶鍵入內容爲止。如果我們沒有收到來自另一端的數據,則從套接字讀取將會阻塞。從管道中讀取將阻塞,直到管道另一端的程序寫入內容爲止。

+0

但是,當您到達EOF時,它們也不會阻塞。 – Barmar

3

你的理解是正確的。 read()僅在從連接的管道或網絡插座讀取時纔會阻塞。

+0

不,如果在數據從磁盤中取出之前沒有可用的數據,它也會阻塞文件的讀取。但是,到達文件結尾時,無需等待,因爲該文件不包含更多數據!文件系統知道這些文件有多長[在檢查時 - 如果有人在納秒後寫入文件,它將會不同!] –

0

here

讀()嘗試讀count個從文件描述符fd字節到緩衝開始buf中。

在任何時候做對常規文件read塊,應常規文件是空的,返回0(如您所見)預計含義0字節從文件..文件類型(如讀了作爲FIFO /管道)支持阻塞行爲。