OSX 上的 Linux 系统调用 C

OSX 上的 Linux 系统调用 C

所以我做了一个快速测试

#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>

int main (int argc, char *argv[]) {
        printf("Hello World\n");
        printf("%d\n",getpid());
}

在运行 OSX 10.9.5 的 macbook pro 上用 gcc 编译打印

Hello World
640

正如我所期望的那样,它在大多数 Linux 发行版上都是如此。我知道 darwin 内核基于 UNIX,但是所有 linux 系统调用在 OSX 上的行为是否与在 Ubuntu 上的行为完全相同? (我知道 pid 是不同的,不同的时间我运行它会有所不同,但这不是我真正在这里谈论的)。我还在 SSD 的一个小分区上安装了 Ubuntu,所以如果答案是否定的,那也没关系。

答案1

我想说,称为getpid()“linux 系统调用”是一种误导。这给人的印象是它是一个Linux-具体的系统调用,但事实并非如此。实际上,getpid()许多其他系统调用都是由 POSIX 指定的,您会发现它在 Linux 和 MacOS 以及许多其他系统上实现,具有相同的行为。

您将在典型软件中使用的大多数系统调用甚至 C 库函数都是由 POSIX 和 ANSI C 等标准指定的,并且您将在许多不同的操作系统上以相同的行为实现它们。可移植软件是保留这组广泛可用的通用系统调用和功能的软件。

Linux 还具有 Linux 特定的系统调用。 MacOS 还具有特定于 MacOS 的系统调用。显然,这些都不能在相反的操作系统上运行。此类系统调用的联机帮助页通常会指出它们不可移植。此外,它们经常作为低级实现细节存在,大多数软件不需要使用它们,这使得大多数软件更容易保持可移植性。

答案2

OS X 是一个经过认证的 UNIX 操作系统,保证它实现 POSIX 标准。 Linux 虽然不是经过认证的 UNIX,但也实现了 POSIX 标准。如果您将 API 调用限制为 POSIX 的一部分,那么您应该在 OS X 和 Linux 之间具有一致的行为。除了 POSIX 之外,C 标准库也是标准化的,编译器和平台之间应该具有相同的行为(只要符合标准)。

Linux 上的手册页getpid(2)说它符合 POSIX.1-2001、4.3BSD 和 SVr4。 OS X 10.10 上的同一手册页表示它符合 POSIX.1-1988。

相关内容