2017-08-08 32 views
0

我有難與其理解read功能C.Çread()函數很難理解文件描述符

len = read(fd, buf, 32); 

當我給你fd爲0,1,2和運行程序,它基本上做同樣的事情,有人可以告訴我這有什麼不同嗎?

+0

你知道fd 0,1,2是什麼意思嗎? –

+2

「基本上做同樣的事情」 - 它在做什麼?它是做你期望的嗎? –

+0

他意思是我認爲的文件描述符。 –

回答

1

據我理解你的問題是爲什麼,如果你從文件描述符0,1閱讀沒有什麼變化,2

在正常程序中的文件描述符0是標準輸入,1是標準輸出和2是標準錯誤。 stdin是你應該讀取輸入的地方,1是你應該在哪裏寫輸出,2是你應該寫錯誤信息的地方。

在幕後,所有三個文件描述符可能指向相同的底層文件(文件也可以是控制檯,網絡連接等)並不少見。如果你只是從命令行運行你的程序,這實際上很可能。在這種情況下,您可以讀取所有這些文件並獲得完全相同的結果。

但是。然後,您決定要將程序的輸出保存到文件中,然後像這樣運行:program > output。現在文件描述符1不再指向與stdin相同的文件,並且程序會中斷。如果將stderr指向某些錯誤記錄工具,則會發生同樣的情況。或從文件或管道獲取輸入。或者在一些調試器中運行該程序。或者不同的終端。這就是爲什麼你應該只從0開始閱讀而沒有其他文件描述符,即使你有時可能會忽略它。

2

read()嘗試讀取文件描述符fd中的字節數。

fd = 0 
fd = 1 
fd = 2 

正在讀取不同的文件描述符。不同之處在於,您正在讀取不同的文件,並且讀入緩衝區的數據不同。

Book ABook B讀數有什麼不同?閱讀一本書的過程是一樣的......它的內容發生了變化。

+0

不同的文件描述符可能指的是同一個文件 –

+0

等待..如果即時通訊運行它的CMD,並要求輸入,那麼「書」是什麼?對不起,我是一個新手在這個東西,我只做競爭性編程... –

+0

@眠りネロク真,但讓我們假設它是不同的文件。 –