打开文件的不同实现

Shi*_*hra 5 operating-system system-calls

我正在阅读"高尔文操作系统概念"一书,并遇到以下声明:

文件打开可以通过以下两种方式实现:

  1. 某些系统在第一次引用时打开文件.一旦工作完成,就关闭它们.
  2. 其他一些系统允许应用程序员在应用程序本身中指定诸如open-read/write-close之类的命令."

我看到Linux/Windows的C程序遵循第二种方法.

  • 有第一种方法的例子吗?
  • 为什么这些系统使用第一种方法?

Lou*_*ltz 0

在理解这两种实现及其优缺点时,我认为在这里进行概括是有用的:

  1. 从文件概念进行概括,以考虑真正获得的任何资源;和
  2. 从操作系统提供的内容概括到所使用的编程语言、库或框架也提供的内容。

至于为什么系统可能会使用第一种方法......

答案同样适用于为什么您可能想要使用RAII这样的编程习惯。即您想要自己进行资源的生命周期管理还是希望它为您完成。

有时,当生命周期管理为我们(我们作为程序员)完成时,我们可能会失去做我们想做的事情的能力(如果我们自己实现生命周期管理,这些事情本来是可能的)。有时,无法泄漏资源比能够访问资源的每一个功能更重要。

以C++中的内存管理为例。我们可以使用从系统分配内存,new或者我们可以调用std::make_shared. delete然而,如果我们想确保内存不泄漏,前者还要求我们(在使用结束时)调用。同时,Java 并没有让程序员直接访问分配内存,而是采用垃圾收集,这样“程序员就可以免除手动内存管理的负担”

至于第一种方法的例子......

许多类 Unix 操作系统都提供了该syslog功能的编程接口。虽然它具有像 和中的类比一样的打开关闭,但调用它们是可选的。人们只需简单地调用即可启动系统日志记录文本。openlogcloselogsyslog

标准输入和输出也同样为我们管理。当程序启动时,它通常已经打开并可用这些概念。当它退出时,这些流将为我们关闭(根据需要)。程序不需要调用fclose(stdout)(也不需要类似的东西fopen("/dev/console"))。程序可以只调用fputsorfgets使用stdoutor stdin