POSIX

POSIX는 운영체제의 프로그래밍 인터페이스와 셸·유틸리티 동작을 정의하는 표준이다. 운영체제 이름이나 특정 C 라이브러리의 이름이 아니다. open, read, fork 같은 인터페이스를 공통으로 정의해 프로그램을 다른 환경으로 옮길 때의 차이를 줄인다.

소스 이식성과 바이너리 호환성 구분하기

POSIX API를 사용한다고 Linux에서 만든 실행 파일이 macOS에서 그대로 실행되지는 않는다. CPU 명령어 집합, 실행 파일 형식, ABI, 동적 로더와 라이브러리가 별도로 맞아야 한다. 표준을 따른 소스도 선택 기능과 구현별 제약을 확인하고 대상 환경에서 다시 빌드·테스트해야 한다.

같은 함수 이름을 쓴다는 것과 프로그램 전체의 동작이 같다는 것도 다르다. 파일명 대소문자, 권한, 지원 옵션, 처리 가능한 자원 한도 등이 결과에 영향을 준다.

C에서 POSIX 인터페이스 사용하기

다음은 프로세스 ID를 출력하는 작은 예제다. ISO C 표준 라이브러리만 쓰는 예제와 달리 POSIX의 <unistd.h>가 필요하다.

#define _POSIX_C_SOURCE 200809L
#include <stdio.h>
#include <unistd.h>

int main(void) {
    printf("pid=%ld\n", (long)getpid());
    return 0;
}

POSIX 개발 환경에서 pid.c로 저장하고 실행한다.

cc -Wall -Wextra -std=c11 pid.c -o pid
./pid

_POSIX_C_SOURCE는 지원하는 헤더에 어떤 인터페이스 선언을 노출할지 요청하는 매크로다. 미지원 기능을 구현하거나 운영체제를 POSIX 인증 제품으로 바꾸지는 않는다. 여기서는 널리 쓰이는 2008 인터페이스 범위를 선택한 것이며, 이를 최신 표준 버전이라는 뜻으로 사용하지 않는다.

이식성 문제를 조사할 때는 소스의 API, 컴파일 옵션, 대상 ABI와 라이브러리를 따로 확인한다. glibc와 LSB도 이 구분으로 읽으면 역할이 명확해진다.

자료: POSIX 표준의 범위, glibc Feature Test Macros