POSIX

EBAB!·2023년 7월 9일
0

OS

목록 보기
2/16

POSIX

POSIX는 "이식 가능한 운영 체제 인터페이스"를 의미합니다. 이는 IEEE가 지정한 운영 체제 간 호환성을 유지하기 위한 표준의 모음입니다. 따라서 POSIX 표준을 준수하는 소프트웨어는 POSIX 표준을 따르는 다른 운영 체제와 호환될 것으로 예상됩니다.

이러한 이유로, Linux 및 Unix-like 운영 체제에서 사용하는 대부분의 도구들은 거의 동일한 방식으로 작동합니다. 예를 들어, ps 명령어를 사용하면 OpenBSD, Debian, macOS에서도 동일하게 작동해야 합니다.

  • 등장 배경 정보 시대 초기에는 프로그래머들이 서로 다른 시스템 인터페이스와 환경을 가진 운영 체제에 소프트웨어를 작성했습니다. 이러한 소프트웨어를 다른 운영 체제로 이식하기 위해서는 많은 수정과 비용이 발생하게 되었습니다. 이 문제를 극복하기 위해 POSIX가 탄생하게 되었습니다. POSIX는 1988년에 원래의 UNIX를 표준화한 것으로, 다양한 UNIX 변종 뿐만 아니라 Non-UNIX 운영 체제 간의 문제를 해결하기 위해 개발되었습니다. POSIX에 대한 작업은 초기 1980년대에 시작되어 급격하게 발전하는 UNIX 시스템 인터페이스를 표준화하고자 하는 목적으로 이루어졌습니다.

POSIX Standard

C API

POSIX는 C 언어를 기반으로 표준을 정의합니다. 따라서 프로그램은 소스 코드 수준에서 다른 운영 체제로 이식될 수 있습니다. 그러나 이를 표준화된 언어로 구현할 수도 있습니다.

POSIX C API는 ANSI C 표준에 여러 가지 측면에서 더 많은 함수를 추가합니다:

  • 파일 작업
  • 프로세스, 스레드, 공유 메모리 및 스케줄링 매개변수
  • 네트워킹
  • 메모리 관리
  • 정규 표현식

이 함수들에 대한 완전한 설명은 POSIX 헤더에서 정의되어 있습니다.

일반적인 개념

C API 외에도 POSIX는 프로그램 작성을 위한 규칙을 추가합니다.

예시)

포인터 유형의 초기화와 동시 실행에 대한 안전성에 대한 규칙을 추가합니다.

메모리 동기화에 대한 규칙을 강제하며, 이미 사용 중인 메모리의 수정을 제한하는 등의 규칙을 정의합니다.

디렉토리 보호와 파일 액세스에 대한 보안 메커니즘도 기술합니다.

파일 형식

POSIX는 파일, 표준 출력, 표준 오류 및 표준 입력에서 사용되는 문자열의 형식화에 대한 규칙을 정의합니다. 예를 들어, 출력 문자열에 대한 설명을 살펴보겠습니다:

"<format>", <arg1>, ..., <argN>
형식은 일반 문자, 이스케이프 시퀀스 문자 및 변환 사양을 포함할 수 있습니다. 변환 사양은 제공된 인수의 출력 형식을 나타내며, 퍼센트 기호로 시작하여 인수 유형이 뒤따릅니다.

예를 들어, 오늘 날짜를 포함하는 문자열을 출력하고자 한다고 가정해 봅시다. POSIX 파일 형식 표준을 따르는 printf 유틸리티를 사용할 것입니다

$ printf "Today's Date: %d %s, %d" 18 September 2021
오늘의 날짜: 18 September, 2021

이 형식에는 세 개의 변환 사양인 %d, %s 및 %d가 지정되어 있습니다. printf 유틸리티는 이러한 변환 사양을 처리하고 인수로 대체합니다.

환경 변수

환경 변수는 로그인 셸이 로그인에 성공한 후에 처리하는 환경 파일에 정의할 수 있는 변수입니다. 관례적으로 변수 이름은 대문자와 밑줄로만 구성되어야 합니다. 이름에는 숫자도 포함될 수 있지만, POSIX 표준은 숫자를 이름의 시작에 두는 것을 권장하지 않습니다.

각 환경 변수의 값은 이식 가능한 문자 집합에 정의된 문자열만으로 구성되어야 합니다. 예를 들어, 사용자의 기본 디렉토리를 환경 변수로 다음과 같이 정의할 수 있습니다:

XDG_BASE_DIRECTORY="/home/user/"
환경 변수의 이름은 원하는 대로 지정할 수 있지만, 표준 유틸리티의 환경 변수와 이름이 충돌하지 않도록 주의해야 합니다. 또한, 준수하는 구현은 환경 변수 이름의 대소문자를 구분해야 합니다. 예를 들어, home과 Home은 두 개의 다른 환경 변수입니다.

환경을 구현 시에는 예약된 환경 변수를 따라야 합니다.

  • COLUMN : 터미널 화면의 너비 정의.
  • HOME : 사용자의 홈 디렉토리의 경로를 정의.
  • LOGNAME: 사용자의 로그인 이름을 정의.
  • LINES: 사용자의 터미널 화면에서 선호하는 라인 수를 정의.
  • PATH : 실행 가능한 파일들의 이진 콜론으로 구분된 경로를 정의.
  • PWD : 현재 작업 디렉토리를 정의.
  • SHELL : 현재 사용 중인 쉘을 정의.
  • TERM : 터미널 유형을 정의.

Locale

Locale은 사용자 환경에서 사용되는 언어와 문화적 규약을 정의합니다. 각 Locale은 날짜-시간 형식, 통화 형식, 숫자 형식 등과 같은 소프트웨어 구성 요소의 동작을 정의하는 카테고리로 구성됩니다.

프로그램 구현은 POSIX Locale에 준수해야 하며, 이는 C Locale과 동일합니다. 프로그램 구현은 현재 정의된 Locale 환경 변수를 사용하여 일관성을 유지해야 합니다. Locale이 설정되지 않은 경우, 구현은 POSIX 호환 Locale을 지정해야 합니다.

다음과 같은 환경 변수들이 POSIX 표준에 따라 각 카테고리에 대해 정의됩니다:

  • LC_TYPE : 문자 분류를 위한 환경 변수.
  • LC_COLLATE : 문자의 정렬 순서를 정의.
  • LC_MONETARY : 통화 형식을 위한 환경 변수.
  • LC_NUMERIC : 숫자 형식을 위한 환경 변수.
  • LC_TIME : 날짜와 시간 형식을 위한 환경 변수.
  • LC_MESSAGES : 정보 메시지와 로그와 같은 프로그램 메시지를 위한 환경 변수.

문자 집합

문자 집합은 각 문자에 대한 코드와 비트 패턴을 포함하는 문자의 모음입니다. 컴퓨터가 이해할 수 있는 것은 이진(binary)뿐이므로, 문자 집합은 컴퓨터가 처리할 수 있는 기호를 나타냅니다.

이를 위해 POSIX에서는 표준 문자 집합을 권장합니다.

POSIX는 구현이 하나 이상의 문자 집합과 이식 가능한 문자 집합을 포함해야 한다고 권장합니다.

문자 집합의 첫 8개 항목은 제어 문자(control characters)여야 합니다. POSIX 로케일에는 이식 가능한 문자 집합과 이식 불가능한 문자 집합으로부터 적어도 256개의 문자가 포함되어야 합니다.

정규 표현식

정규 표현식 또는 RE는 텍스트를 찾는 검색 패턴을 정의하는 문자열입니다. 표준 C 라이브러리는 RE를 구현하며, awk, sed, grep과 같은 프로그램에서 백엔드로 사용됩니다.

POSIX 준수 구현은 기본 정규 표현식(BRE) 또는 확장된 정규 표현식(ERE)을 사용할 수 있습니다.

BRE는 텍스트 검색을 위한 기본 표기법을 제공하며, ERE는 더 많은 표기법을 지원합니다. 대부분의 POSIX 준수 유틸리티는 BRE에 크게 의존하지만, 고급 텍스트 조작 유틸리티는 ERE도 지원합니다.

또한, BRE과 ERE에는 다음과 같은 몇 가지 요구 사항이 적용됩니다:

  • BRE과 ERE은 NUL 문자로 끝나는 문자열에서 작동해야 합니다.
  • 문자 이스케이프 시퀀스와 개행 문자는 정의되지 않은 결과를 만들어내므로, 우리의 프로그램은 이들을 보통의 문자로 처리해야 합니다.
  • POSIX는 RE 또는 일치시킬 텍스트에서 명시적인 NUL 문자의 사용을 허용하지 않습니다.
  • 구현 시 기본적으로 대소문자를 구분하지 않는 검색을 수행할 수 있어야 합니다.
  • RE는 256바이트를 초과해서는 안 됩니다.

디렉토리 구조

대부분의 주요 Linux 배포판은 파일 시스템 계층 표준 (FHS)을 준수합니다. FHS는 구성 가능한 트리 형태의 디렉토리 구조를 정의합니다. 계층 구조에서 첫 번째 디렉토리는 루트 디렉토리이며, 다른 모든 디렉토리, 파일 및 특수 파일은 루트 디렉토리에서 분기합니다.

디렉토리 구조를 더 잘 확인하기 위해 tree 유틸리티를 사용할 수 있습니다.

$ tree / -d -L 1
/
├── bin -> usr/bin
├── boot
├── dev
├── etc
├── home
├── lib64 -> usr/lib
├── mnt
├── opt
├── proc
├── root
├── run
├── sbin -> usr/bin
├── sys
├── usr
└── var

FHS가 구성 가능한 디렉터리 구조를 허용하긴 하지만,

우리 프로그램은 루트 (/)와 /dev 디렉터리 아래에 파일이나 디렉터리를 생성해서는 안됩니다. 하지만 XDG 기본 디렉터리와 같은 사용자 디렉터리 아래에는 파일과 디렉터리를 생성할 수 있습니다. 또한 /tmp 디렉토리를 사용하여 임시 파일과 디렉토리를 생성할 수도 있습니다.

유틸리티

UNIX/Linux 환경에서 유틸리티에 익숙해지면 대부분의 유틸리티가 동일한 방식으로 동작하는 것을 알 수 있습니다. (예를 들어, 거의 모든 UNIX/Linux 유틸리티에서 -h 옵션은 도움말 텍스트를 출력).

이런 일관성은 POSIX에서 정의한 규칙에 따른 것입니다.

POSIX는 프로그래머들에게 유틸리티 프로그램을 구현할 때 다음과 같은 인자 구문을 권장합니다:

utility_name [-a][-b][-c option_argument]
    [-d|-e][-f[option_argument]][operand...] <parameter name>

설명:

  • utility_name: 이는 유틸리티의 이름으로, 옵션과 인자들이 뒤에 따릅니다.
  • 대괄호 [ ] 내부의 항목은 선택적이며, 생략할 수 있습니다.
  • ab는 프로그램의 기능을 활성화 또는 비활성화하는 플래그입니다.
  • c 옵션은 인자와 빈 공백 문자 사이에 인자가 필요합니다.
  • de 옵션은 파이프 |로 구분되어 있어 두 옵션 중 하나만 사용할 수 있음을 나타냅니다.
  • f 옵션은 옵션과 옵션-인자가 빈 공백 문자 없이 함께 사용되어야 함을 지정하며, 인자가 없는 옵션은 다음 인자를 옵션의 인자로 처리하지 않아야 합니다.
  • 피연산자는 유틸리티가 처리하는 모든 것으로, 예를 들어 텍스트 파일 등이 될 수 있습니다.
  • 피연산자 뒤의 점 세 개 ...는 유틸리티에 영향을 미치는 피연산자를 0개 이상 입력할 수 있음을 나타냅니다.
  • 각각의 꺾쇠 괄호 내부의 항목은 실제 값으로 대체되어야 합니다.
  • 또한, 유틸리티에서 필요한 옵션의 경우 대괄호를 생략할 수 있습니다. 또한 많은 옵션이 있는 복잡한 유틸리티의 경우 옵션들을 그룹화할 수 있습니다.
profile
공부!

0개의 댓글