【问题标题】:Different implementations of opening files打开文件的不同实现
【发布时间】:2015-05-25 12:31:27
【问题描述】:

我正在阅读《高尔文的操作系统概念》一书,遇到以下说法:

文件打开可以通过以下两种方式中的任意一种实现:

  1. 某些系统在首次引用时打开文件。并在工作完成后关闭它们。
  2. 其他一些系统允许应用程序程序员指定一个顺序,例如应用程序本身的打开-读取/写入-关闭。”

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

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

【问题讨论】:

  • 具有 JCL 的 IBM 大型机系统指定哪些文件连接到哪个通道号算作第一种技术的说明吗?
  • 我认为这就是#1 中提到的内容。从旧的 FORTRAN 和 COBOL 没有 OPEN 语句的时代开始。

标签: operating-system system-calls


【解决方案1】:

在理解这两种实现及其优缺点时,我认为在这里概括一下很有用:

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

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

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

有时,当我们(我们作为程序员)完成生命周期管理时,我们可能会失去做我们想做的事情的能力(如果我们自己实施生命周期管理,这些事情可能会发生)。有时,不能泄露资源比能够访问它的每一个花里胡哨更重要。

以 C++ 中的内存管理为例。我们可以使用new 从系统分配内存,也可以调用std::make_shared。然而,如果我们想确保内存不泄漏,前者要求我们还调用delete(在其使用结束时)。同时,Java 并没有让程序员直接访问分配内存,而是使用垃圾收集,以便"programmers can be spared the burden of having to perform manual memory management"

关于第一种方法的例子……

许多类 Unix 操作系统为syslog 工具提供编程接口。虽然它在 openlogcloselog 中具有 openclose 类比,但调用它们是可选的。只需调用syslog 即可启动系统日志记录文本。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-20
    • 2016-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多