在「Unix環境下的高級編程」,第2版,由W. Richard Stevens編寫。任何人都可以在fork()之後解釋有關'文件描述符'的簡單描述嗎?
第8.3節fork函數。
這裏的描述:
認爲家長和孩子共享同一個文件偏移量是很重要的。
考慮一個過程,分叉一個孩子,然後等待孩子完成。假定這兩個進程都是作爲正常處理的一部分寫入標準輸出。如果父級的標準輸出被重定向(可能是由shell),那麼當子級寫入標準輸出時,父級的文件偏移量必須由子級更新。
[1。這是什麼意思?例如,如果父級的std輸出被重定向到'file1',那麼孩子在寫入後應該更新哪些內容?父母的原始標準輸出偏移或重定向輸出(即file1)偏移?不能是後來的吧?]
[2。更新如何完成?由孩子明確地,由操作系統隱式地由文件描述符本身?在fork之後,我認爲父母和孩子走自己的路,並擁有自己的文件描述符COPY。那麼孩子如何更新父母側的偏移?]
在這種情況下,孩子可以寫入標準輸出,而父母正在等待它;在孩子完成後,父母可以繼續寫入標準輸出,知道其輸出將被附加到孩子寫的任何內容。如果父母和孩子沒有共享相同的文件偏移量,這種類型的交互將更加難以完成,並且需要父母採取明確的行動。
如果父項和子項都寫入相同的描述符,而沒有任何形式的同步,比如讓父級等待子級,則它們的輸出將被混合(假設它是在fork之前打開的描述符)。雖然這是可能的,但這不是正常的操作模式。
在fork之後處理描述符有兩種正常情況。
父母等待孩子完成。在這種情況下,父母不需要對其描述符做任何事情。當孩子終止時,孩子讀取或寫入的任何共享描述符將相應地更新其文件偏移量。
父母和孩子都走自己的路。在這裏,在fork之後,parent關閉了它不需要的描述符,並且這個孩子做了同樣的事情。這樣,既不干擾對方的開放描述符。這種情形往往是與網絡服務器的情況。」
[3.當調用fork()的,我所不解的是,孩子得到了什麼樣的父母,文件描述符的副本在這種情況下,和做它的事情。如果有任何偏移變化文件描述符父母子女分享,那隻能是因爲描述符記得偏移本身。我說得對不對?]
對不起我是一種新的概念。
任何幫助?謝謝。
艾倫,解釋很棒!感謝您花時間爲新手解釋它的細節。 – user1559625 2012-07-31 06:55:44
@AlanCurry如果我不在父程序中使用wait()會怎麼樣?作爲父進程退出時,文件描述是免費的嗎? – Nmzzz 2014-02-15 08:10:23
有幫助!謝謝! – Kross 2016-10-28 13:04:18