文件描述符表和系统调用

时间:2014-03-29 11:56:08

标签: c file operating-system system-calls

我一直在阅读有关文件描述符以及操作系统如何管理文件并使用C系统调用" open()"为进程提供对它们的访问,我有几个问题:

  • 文件描述符表:它只是一个所有进程共享的大数据结构(比如说,有两个进程:进程A和进程B,它们是否有指向操作系统文件描述符表的指针),或者操作系统是否为每个进程创建了一个全新的文件描述符数组?
  • 还有哪些编程语言可以调用系统调用?例如,我知道使用C / C ++,您可以使用OS接口(fork(),close(),open(),execl()......等)轻松调用系统调用,但是Java呢?我不记得有一种调用这些功能的方法。它究竟是如何工作的? JVM是否只是将我的代码翻译(需要翻译)到上面的系统调用?那么像Python这样的其他高级编程语言呢?
  • 如果我在系统调用close()打开文件后不关闭文件会有什么危害?

感谢。

1 个答案:

答案 0 :(得分:2)

  1. 有一个系统范围的打开文件描述表,并且有一个打开文件描述符的每进程表。每个打开的文件描述符引用一个打开的文件描述(参见open()close()),但有几个描述符可能会引用相同的描述(想想dup()dup2()fork())。

  2. 任何语言都可以通过调用实际进行系统调用的适当的汇编程序来调用系统调用。大多数脚本语言都是基于C或C ++构建的,因此它们不计算在内,但其他语言 - 比如Fortran或Ada或D或Go - 可以以适合其语义的方式提供对系统调用的访问。

  3. 您已打开一个不需要打开的文件描述符,因此您可以同时打开一个较少的其他文件。如果您的程序很短并且不会耗尽资源,您可以忽略关闭它。关闭文件有助于确保将数据写入磁盘;操作系统内核知道,如果您的程序是打开文件并关闭文件的唯一进程,则不再需要它在缓冲区高速缓存中的任何磁盘块。