2014-03-29 36 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描述的第二段说明状态是未指定的。目前还不清楚文件描述符是关闭还是仍然打开,以及是否打开另一个关闭它的尝试是否会以同样的方式失败,等等。这并不是说你不应该注意,特别是如果你的数据是珍贵的,但这并非完全无关紧要。 –