我一直在阅读有关文件描述符以及操作系统如何管理文件并使用C系统调用"open()"为进程提供对它们的访问,我有几个问题:
- 文件描述符表:它只是一个所有进程共享的大数据结构(比如,有两个进程:进程A和进程B,它们是否有指向操作系统文件描述符表的指针),还是操作系统为每个进程创建一个全新的文件描述符数组?
- 还有哪些编程语言可以调用系统调用?例如,我知道用C/c++你可以很容易地调用系统调用使用操作系统接口(fork(),close(),open(),execl()…等等),但是Java呢?我不记得有调用这些函数的方法。它到底是如何运作的呢?JVM只是将(需要翻译的)我的代码转换为上述系统调用吗?那么像Python这样的高级编程语言呢?
- 如果我在使用close()系统调用打开文件后不关闭它,会造成什么危害?
谢谢。
-
有一个系统范围的打开文件描述表,还有一个打开文件描述符的每个进程表。每个打开的文件描述符引用一个打开的文件描述(参见
open()
和close()
),但几个描述符可能指的是相同的描述(如dup()
,dup2()
和fork()
)。 -
任何语言都可以通过调用适当的汇编程序来调用系统调用,而汇编程序实际上是进行系统调用的。大多数脚本语言都是建立在C或c++之上的,所以它们不算数,但是其他语言——比如Fortran或Ada或D或Go——可以以适合其语义的方式提供对系统调用的访问。
-
您已经打开了一个不需要打开的文件描述符,因此您可以同时打开一个更少的其他文件。如果您的程序很短并且不会耗尽资源,您可以忽略关闭它。关闭文件有助于确保数据被写入磁盘;操作系统内核知道,如果你的程序是唯一打开文件并关闭它的进程,那么它的缓冲区缓存中的任何磁盘块都将不再需要。