Linux 시스템은 OSX에서 C를 호출합니다.

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());
}

OSX 10.9.5를 실행하는 Macbook Pro에서 gcc를 사용하여 컴파일 및 인쇄

Hello World
640

예상대로 대부분의 Linux 배포판에서 작동합니다. 나는 darwin 커널이 UNIX를 기반으로 한다는 것을 알고 있지만 모든 Linux 시스템 호출은 Ubuntu에서와 마찬가지로 OSX에서도 정확히 동일하게 작동합니까? (PID가 다르고 실행할 때마다 다르다는 것을 알고 있지만 실제로 여기서 말하는 것은 아닙니다.) SSD의 작은 파티션에도 Ubuntu를 설치했으므로 대답이 '아니오'라면 괜찮습니다.

답변1

getpid()나는 그것을 "리눅스 시스템 호출"이라고 부르는 것이 오해의 소지가 있다고 말하고 싶습니다 . 이것은 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을 준수한다고 나와 있습니다.

관련 정보