2014-03-29 32 views
0

我一直在閱讀有關文件描述符以及操作系統如何使用C系統調用「open()」來管理文件併爲它們提供訪問權限,並且我有幾個問題:文件描述符表和系統調用

  • 文件描述符表:它只是一個所有進程共享的大數據結構(比如說有兩個進程:進程A和進程B,它們是否有指向OS的文件描述符表的指針),還是操作系統爲每個進程創建一個全新的文件描述符數組?
  • 其他編程語言可以調用哪些系統調用?例如,我知道使用C/C++可以使用操作系統接口(fork(),close(),open(),execl()等輕鬆地調用系統調用),但Java呢?我不記得有一種調用這些函數的方法。它究竟如何在那裏工作? JVM只是將我的代碼翻譯(需要翻譯什麼)到上面的系統調用?那麼Python的其他高級編程語言呢?
  • 如果我在打開系統調用close()後不關閉文件會造成什麼危害?

謝謝。

回答

2
  1. 有一個系統範圍的開放文件描述表,每個進程都有一個打開文件描述符表。每個打開的文件描述符指的是打開的文件描述(請參閱open()close()),但幾個描述符可能指代相同的描述(認爲dup(),dup2()fork())。

  2. 任何語言都可以通過調用實際進行系統調用的適當彙編程序來調用系統調用。大多數腳本語言都是建立在C或C++之上的,因此它們不計算在內,但其他語言(如Fortran或Ada或D或Go)可以以適合其語義的方式訪問系統調用。

  3. 你已經打開了一個文件描述符,不需要打開,所以你可以一次打開少一個其他文件。如果你的程序很短並且不會耗盡資源,則可以忽略關閉它。關閉文件有助於確保數據寫入磁盤;如果您的程序是打開文件並關閉文件的唯一進程,則操作系統內核知道其緩衝區緩存中的任何磁盤塊將不再需要。

+0

美麗,謝謝!這是非常豐富的。 –

+1

3.此外,您需要檢查close()的返回值以獲得所有可能錯誤的通知(尤其是套接字,但文件寫入也可能在刷新時失敗)。 – ninjalj

+0

是的,但請注意'close(fd)'失敗的錯誤語義有點令人困惑。如果close()失敗,fd仍然打開或不打開? ['close()'](http://pubs.opengroup.org/onlinepubs/9699919799/functions/close.html)的POSIX描述的第二段說明狀態是未指定的。目前還不清楚文件描述符是關閉還是仍然打開,以及是否打開另一個關閉它的嘗試是否會以同樣的方式失敗,等等。這並不是說你不應該注意,特別是如果你的數據是珍貴的,但這並非完全無關緊要。 –