Home [Develop] POSIX
Post
Cancel

[Develop] POSIX

개요

안녕하세요.

이번 글에서는 유닉스의 API 표준인 POSIX에 대해 살펴보겠습니다.


POSIX

POSIX 정의

IEEE [그림 1] IEEE

POSIX(Portable Operating System Interface + X)는 IEEE에서 지정한 유닉스의 API 규약입니다.

유닉스는 제조사 중립적이기 때문에 표준 시스템 인터페이스로 선택되었습니다.

하지만 유닉스의 몇몇 주요 버전이 생겼고 공통 분모 역할을 할 시스템이 필요해졌습니다.

이를 해결하고자 POSIX라는 규약을 만들고 이를 표준으로 지정합니다.

초창기 Unix-liked 운영체제를 위한 POSIX의 사양은 1개의 코어 프로그래밍 인터페이스를 다룬 문서 1개로 이루어졌습니다.

하지만 시간이 흐르면서 POSIX.1, POSIX.2 등 19개의 개별 문서로 나뉘었습니다.

POSIX 특징

공통된 규약을 바탕으로 유닉스의 호환성과 이식성을 크게 향상시켰습니다.

예를 들어, 표준화된 유저의 명령줄 및 스크립트 인터페이스는 UNIX System V 쉘을 기반으로 합니다.

또한 POSIX는 대부분의 현대 운영체제에서 제공되는 표준 thread 라이브러리 API를 정의합니다.


POSIX의 예시

POSIX CLI

POSIX를 따르는 운영체제의 CLI는 모두 유사한 명령어 체계를 따릅니다.

경로

어디서나 동일한 경로를 가지는 절대경로와 현재 위치에 따라 다른 경로를 가지는 상대경로로 나뉩니다.

다음과 같은 구조의 시스템이 있다고 가정하겠습니다.

1
2
3
4
5
6
7
8
/
├ bin/
├ ...
└ home/
  ├ myUser/
  │ └ hello.sh
  └ remoteUser/
    └ hello.sh

여기서 myUserhello.sh를 실행하고 싶다면 다음과 같이 경로 지정이 가능합니다.

참고로 .는 현재 디렉토리 경로, ..는 부모 디렉토리의 경로를 의미합니다.

  1. 절대경로: /home/myUser/hello.sh
  2. 상대경로(현재 위치가 myUser): ./hello.sh
  3. 상대경로(현재 위치가 remoteUser): ../myUser/hello.sh

만약 3의 상황에서 2의 명령어를 실행한다면 remoteUser에 존재하는 hello.sh가 실행됩니다.

각종 명령어

공통적으로 사용할 수 있는 명령어가 존재합니다.

다음은 많이 사용되는 명령어로 각 명령어마다 다양한 옵션이 존재합니다.

commandsurmmaryusage
manmanual. 해당 명령어의 사용법을 vi 에디터로 엽니다.man pwd
pwdpresent working directory. 현재 위치한 경로를 절대경로로 출력합니다.pwd
cdchange directory. 현재 위치한 경로를 변경합니다.cd $home
rmremove. 파일을 삭제합니다.rm test.txt
mvmove. 파일을 이동시키거나 파일의 이름을 변경합니다.mv origin.txt fix_01.txt
cpcopy. 파일을 복사합니다.cp fix_01.txt fix_02.txt

POSIX Thread

POSIX Thread(pthread)는 POSIX 규격에 부합하는 프로그래밍 언어 독립적이고 병렬 실행 가능한 모델입니다.

특징

각 작업 흐름은 thread로 불리며 POSIX Thread API의 호출을 통해 흐름을 생성하고 제어합니다.

pthreads는 C언어의 타입, 함수, 전역 변수의 집합으로 정의하며 이는 pthread.h에 구현되어 있습니다.

pthread.h의 구현체는 리눅스용 glibc, 윈도우용 pthreads-win32, BSD시스템용 libpthread으로 나뉜다고 합니다.

C에 대한 지식은 한없이 얕아서 보다 자세한 내용은 생략하겠습니다…

예시 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <stdio.h>
#include <pthread.h>

void* thread_function(void* arg) {
    int thread_id = *((int*)arg);

    printf("Hello from thread %d\n", thread_id);
    pthread_exit(NULL);
}

int main() {
    // pthread_t 자료형 선언
    pthread_t thread1, thread2;
    int thread_id1 = 1, thread_id2 = 2;

    // pthread 생성
    pthread_create(&thread1, NULL, thread_function, (void*)&thread_id1);
    pthread_create(&thread2, NULL, thread_function, (void*)&thread_id2);

    // pthread 종료까지 대기
    pthread_join(thread1, NULL);
    pthread_join(thread2, NULL);

    return 0;
}

pthread의 간단한 예시 코드입니다.

pthread_t를 이용해 pthread의 정보를 저장할 자료형을 선언합니다.

pthread_create 함수로 pthread 2개를 생성합니다. 이때 인자로 thread_id1thread_id2를 넘겨줍니다.

마지막으로 pthread_join 함수로 pthread가 종료될 때까지 대기합니다.


마무리하며

이번 글에서는 POSIX에 대해 알아보았습니다.

POSIX는 유닉스의 호환성과 이식성을 위해 만들어진 표준입니다.

POSIX의 특징을 엿볼 수 있는 곳은 다양하며 이 글에서는 POSIX CLI와 POSIX thread를 확인해보았습니다.

참고로 윈도우의 CMD과 PowerShell 그리고 Window Terminal은 POSIX를 따르지 않습니다.

대신 Window Terminal에서 WSL(Window Subsystem for Linux)을 사용할 수 있으므로 제한적으로 POSIX를 따르는 Shell을 이용할 수 있습니다.

이 글이 조금이나마 도움이 되셨으면 합니다.

감사합니다. 😀


참고 문헌

This post is licensed under CC BY 4.0 by the author.

[Python] Python Logging 기본

[CS] 프로세스와 스레드 03 - 스레드의 개념과 구현

Comments powered by Disqus.