【问题标题】:Why there are two versions of open() in man page?为什么手册页中有两个版本的 open()?
【发布时间】:2014-07-11 00:05:37
【问题描述】:

我很清楚手册页由 s.t. 部分分隔。 man(2) 谈论系统调用,man(3) 谈论库函数。我也知道fopen(C 库函数)和open(系统调用)之间的区别。但是open(2)open(3) 有什么区别?

当我在open 的手册页中寻找O_DIRECT(用于直接I/O)时,我想到了。奇怪的是,我发现它在版本 open(2) 中是一个有效标志,但不是 open(3)

这很有趣。我知道open(2) 是一个Linux 系统调用(也许我应该说*nix?)。而且 AFAIK,没有名为 open 的 C 库函数。那么open(3) 是什么?

我在网络上进行了一些搜索,但没有找到任何明确回答我的问题的内容。这是否来自 POSIX 标准?这是我能猜到的最后一件事。如果这是真的,有什么区别?是不是open(2) 仅在 Linux 中实现,而open(3) 在 Unix 和 Linux 中都实现(因为 POSIX)。对吗?

顺便说一句,如果有人知道O_DIRECT 被排除在open(3) 之外的原因,我将不胜感激。

谢谢。

【问题讨论】:

  • 我的 Ubuntu 机器上没有 open(3)。您使用的是什么发行版?
  • 是的,我知道这一点。这就是为什么我要问它是什么。还是谢谢。

标签: c linux posix


【解决方案1】:

open(3) 是 POSIX open 函数的描述。 Linux 上真正的函数是open(2)。这个想法是,如果您坚持open(3) 描述,那么您的代码应该可以在另一个符合 POSIX 的系统上运行。但是,如果您使用实际底层 open(2) 函数的功能,而该功能不在 open(3) 描述中(例如 O_DIRECT 标志),那么您就牺牲了 POSIX 可移植性。

【讨论】:

  • 听起来像是 C++ 中的一个虚函数覆盖,其中 open(3) 是基类,open(2) 是派生类。也就是说,我们可以在特定发行版(例如 Ubuntu)上同时拥有这两个版本吗?我可以选择使用符合 POSIX 标准的版本吗?据 man 介绍,这两个函数似乎包含在同一个头文件中。我该如何选择?
  • 这有点违反直觉,因为open(3) 也应该在符合 POSIX 的 Linux 上实现。
  • @EricZ open(2) 符合 POSIX。但它有一些扩展。手册页open(3) 描述了 POSIX 接口。它根本不是一个 separate 函数。这只是一个手册页。函数的 POSIX 描述永远不会出现在手册的第 2 部分中,因为这些是系统特定的函数。
  • 好的。因此,既然有一个特定于平台的O_DIRECT 标志仅适用于open(2),为什么它仍然与“接口”open(3) 兼容?我想只要它实现了 POSIX 版本的所有语义,同时允许自己添加一些扩展?
  • 我们应该说 open(2) 是 POSIX 兼容的,只要它不使用 O_DIRECT(和任何其他扩展名)。酷。
猜你喜欢
  • 2015-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多