web-dev-qa-db-ja.com

LinuxシステムはOSX上の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());
}

oSX10.9.5プリントを実行している私のmacbookproでgccを使用してコンパイル

Hello World
640

ほとんどのLinuxディストリビューションでそうなると思います。 darwinカーネルがUNIXに基づいていることは知っていますが、すべてのLinuxシステムコールはOSXでもUbuntuとまったく同じように動作しますか? (pidは、実行するたびに異なることを認識していますが、それは私がここで実際に話していることではありません)。 SSDの小さなパーティションにもUbuntuをインストールしているので、答えが「いいえ」の場合は問題ありません。

2
asky

getpid()を「Linuxシステムコール」と呼ぶのは誤解を招くと思います。それはLinux -specificシステムコールであるという印象を与えますが、そうではありません。実際、getpid()および他の多くのシステムコールはPOSIXによって指定されており、LinuxとMacOSの両方、および他の多くのシステムに同じ動作で実装されています。

一般的なソフトウェアで使用するシステムコールの大部分、またはCライブラリ関数でさえ、POSIXやANSI Cなどの標準によって指定されており、多くの異なるオペレーティングシステムで同じ動作で実装されます。ポータブルソフトウェアは、広く利用可能なこの一連の一般的なシステムコールと関数を維持するソフトウェアです。

Linuxには、Linux固有のシステムコールもあります。 MacOSには、MacOS固有のシステムコールもあります。明らかに、どちらも反対のオペレーティングシステムでは機能しません。このようなシステムコールのマンページは、通常、移植性がないという事実を示しています。さらに、それらは低レベルの実装の詳細として頻繁に存在し、ほとんどのソフトウェアはそれらを使用する必要がないため、ほとんどのソフトウェアを移植可能に保つことが容易になります。

8
Celada

OS Xは 認定UNIXオペレーティングシステム であり、POSIX標準の実装を保証します。 Linuxは、認定されたUNIXではありませんが、POSIX標準も実装しています。 API呼び出しをPOSIXの一部であるものに制限する場合、OSXとLinuxの間で一貫した動作が必要です。 POSIXの他に、C標準ライブラリも標準化されており、コンパイラとプラットフォーム間で同じ動作をする必要があります(標準に準拠している限り)。

Linuxのgetpid(2) manページには、POSIX.1-2001、4.3BSD、およびSVr4に準拠していると記載されています。 OS X 10.10の同じマニュアルページには、POSIX.1-1988に準拠していると書かれています。

2
casey