Linux 系统在 OSX 上用 C 调用

ask*_*sky 2 osx programming c system-calls

所以我做了一个快速测试

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

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

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

Hello World
640
Run Code Online (Sandbox Code Playgroud)

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

Cel*_*ada 8

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

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

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