3

主要 *NIX 变体中的系统调用数量是否存在差异?

哪些系统调用将得到普遍支持?

4

2 回答 2

12

任何不是 posix 标准的东西都可能是额外的系统调用,或者可能是系统调用层之上的额外库功能。如果您的目标是编写可移植代码,请坚持使用 posix,并尽可能多地使用 c 库(而不是直接系统调用)。

如果您只是好奇,它们的差异很大。为了符合 posix 标准,您不需要以系统调用的方式支持太多。它指定了您需要支持的接口,但是您是通过调用内核还是跳转到共享库来实现这一点几乎取决于您。

Mac OS X 甚至不保证版本之间系统调用的二进制兼容性,他们认为它们是系统库和操作系统之间的私有接口。大多数人认为的系统调用实际上是调用内核的动态库中的小存根,如果您直接进行系统调用而不是链接到该动态库并调用存根函数,那么您的代码可能会在操作系统之间中断发布。

这种灵活性意味着许多操作系统实现的系统调用与它们支持 posix 所需的完全不同,然后处理它们库中的差异。例如,Linux 的线程实现基于一个名为 clone() 的系统调用,并且它们处理大部分簿记以使 pthreads 接口在它们的库中工作。

因此,如果您的目标是实现一个不与其他任何东西链接并在多个 unix 上工作的标准库,那么在某些情况下您可能会发现事情有点棘手。如果你的目标是编写一些链接到各种 Unix 上的标准库的东西,你可以获得一个普遍统一的接口。

于 2008-11-08T13:30:32.693 回答
6

我能找到的最好的是Unix-Linux-BSD Cheat-Sheets,用于各种系统调用变体,与Solaris 系统调用进行比较。

仅对于 Unix,系统调用的数量或多或少增加了四倍,具体取决于您所说的“系统调用”。
Advanced UNIX Programming 第一版只关注大约 70 个真正的内核系统调用——例如,open、read 和 write;但不是像 fopen、fread 和 fwrite 这样的库调用。
第二版包括大约 300 个。(总共有大约 1,100 个标准函数调用,但其中许多是标准 C 库的一部分,或者显然不是内核工具。)
今天的 UNIX 有线程、实时信号、异步 I/ O,以及新的进程间通信特性(POSIX IPC),这些特性在 20 年前都不存在

于 2008-11-08T13:34:12.543 回答