fork() 함수는 부모 프로세스의 복제본을 만들어 자식 프로세스를 생성한다.fork() 함수의 반환값을 통해 서로를 구분한다. (부모는 자식의 PID를, 자식은 0을 반환받음.)fork() 호출 직후부터 실행을 시작하며, 부모와 동일한 프로그램 상태에서 시작한다.exec() 함수 호출로 새로운 프로그램으로 변환할 수 있다.execve() 함수는 실행 중 환경 변수 배열을 지정할 수 있다.wait() 또는 waitpid() 함수를 사용해 자식의 종료 상태를 회수한다.WIFEXITED(status) 매크로를 사용해 자식 프로세스가 정상적으로 종료되었는지 확인할 수 있다.exit() 함수 또는 return 문으로 설정할 수 있으며, 반드시 main 함수 내의 return만 요구되는 것은 아니다.WIFSIGNALED(status)로 확인 가능하다.socketpair와 같은 대안을 사용할 수 있다.SIGKILL은 프로세스를 강제로 종료하며 무시할 수 없고, SIGTERM은 종료 요청을 전달하며 무시 또는 핸들링 가능하다.signal() 또는 sigaction() 함수를 사용해 프로세스가 동작을 변경할 수 있다.kill -l 명령어를 사용하면 시스템에서 사용 가능한 시그널 종류와 번호를 확인할 수 있다.Pthread API는 다중 스레드 기반 프로그래밍을 위해 POSIX 표준에서 제공하는 라이브러리이다. 이를 통해 여러 스레드를 생성하고 관리할 수 있다.
1. Pthreads는 스레드 간 자원 공유를 지원하나, 공유 변수에 대해 기본적으로 동기화는 제공하지 않으므로 별도의 동기화 메커니즘이 필요하다.
2. Pthreads는 스레드를 생성하고 관리하는 데 사용되며, 프로세스 생성을 지원하지 않는다.
3. POSIX 스레드 라이브러리는 세마포어를 포함하며, sem_t와 같은 데이터 구조를 통해 동기화 구현이 가능하다.
4. 대부분의 Linux 시스템에서 glibc에 Pthreads가 포함되어 있으며, 별도의 설치 없이 사용할 수 있다.
pthread_create: 새로운 스레드를 생성하며, 생성된 스레드가 실행할 함수와 전달할 인수를 지정할 수 있다.pthread_exit: 현재 실행 중인 스레드를 종료하며, 스레드의 종료 상태를 다른 스레드에 전달할 수 있다.pthread가 아닌 sem_init 함수를 사용하며, Pthread 라이브러리의 일부는 아니다.pthread_join: 특정 스레드가 종료될 때까지 대기하며, 종료 상태를 회수할 수 있는 함수다.mutex나 condition variable도 제공한다.pthread_create 함수의 인자들pthread_t *thread: 생성된 스레드의 ID를 저장할 변수에 대한 포인터이다. 이는 종료 상태 값을 의미하지 않는다.const pthread_attr_t *attr: 스레드의 속성을 지정하는 데 사용되며, 기본 속성을 사용할 경우 NULL을 전달할 수 있다.void *(*start_routine)(void *): 새로 생성된 스레드에서 실행할 함수의 포인터로, 반환값과 입력값 모두 void * 타입이어야 한다.void *arg: 실행 함수에 전달할 인자로, 다양한 데이터를 전달하기 위해 일반 포인터 타입으로 설정된다.pthread_mutex_lock: 뮤텍스를 잠그는 함수로, 성공적으로 실행되면 다른 스레드가 해당 뮤텍스를 사용할 수 없도록 막는다.x = go_beyond(x))는 임계 구역에 해당하며, 상호 배제가 보장된다.pthread_mutex_unlock: 뮤텍스를 해제하는 함수로, 이후 다른 스레드가 뮤텍스를 사용할 수 있도록 허용한다.mmap는 파일 또는 장치를 프로세스의 메모리 공간에 매핑하여 효율적인 파일 I/O를 가능하게 하는 시스템 호출이다.
1. mmap으로 매핑된 메모리 공간을 해제하려면 반드시 munmap() 함수를 사용해야 한다.
2. read()와 close()는 파일 I/O와 관련된 함수로 메모리 매핑 해제와는 무관하다.
3. munmap(void *addr, size_t length)는 매핑된 메모리 주소와 길이를 인자로 받아 매핑을 해제한다.
4. destroy()는 C 표준 라이브러리나 POSIX 표준에서 정의된 함수가 아니다.
msync 함수는 mmap으로 매핑된 메모리 영역을 파일 시스템과 동기화하는 데 사용된다.
1. MS_ASYNC: 비동기 방식으로 동기화를 수행하며, 함수 호출 후 즉시 프로그램이 속행된다.
2. MS_SYNC: 동기 방식으로 동기화를 수행하며, 동기화가 완료된 후 프로그램이 속행된다.
3. MS_ALERT: 존재하지 않는 동기화 옵션이다. POSIX 표준이나 Linux 시스템에서 정의되지 않았다.
4. MS_INVALIDATE: 매핑된 메모리와 파일 시스템 간의 캐시를 무효화하고, 다른 프로세스가 수정된 데이터를 읽도록 강제한다.
inode는 파일 시스템에서 파일의 메타데이터를 저장하는 데이터 구조이다.
1. inode는 파일을 구성하는 데이터의 저장 매체상 위치(데이터 블록 주소)를 포함한다.
2. 파일의 소유자 정보(UID), 권한, 생성/수정 시간 등의 메타데이터를 제공한다.
3. 파일의 크기와 관련된 정보도 inode에 포함된다.
4. 파일이 저장된 디렉토리의 이름은 inode에 포함되지 않으며, 디렉토리 엔트리에서 파일 이름을 관리한다.
inode 메타데이터를 얻기 위해 POSIX에서 제공하는 다양한 함수가 사용된다.
1. fstat(...): 파일 디스크립터를 이용하여 inode의 메타데이터를 가져온다.
2. stat(...): 파일의 경로를 통해 inode의 메타데이터를 가져온다.
3. lstat(...): 심볼릭 링크 자체의 메타데이터를 가져온다(링크를 따라가지 않음).
4. openat(...): 파일을 여는 함수로, inode 메타데이터를 직접적으로 반환하지 않는다.
bash, sh, 또는 다른 쉘 환경에서 동작하며, 변수 선언이 공백 없이 name='value' 형식으로 작성한다.#으로 시작하며, C언어의 #include 같은 구문은 쉘 스크립트 문법에 포함되지 않는다.key, _ :=)이나 정밀한 실수 처리 문법(int x= 3.55)이 포함되지 않는다.chmod +x)한 후 ./script.sh와 같은 방식으로 실행한다.