목록유닉스(Unix)/시스템 프로그래밍 (33)
K 개발자
세마포어의 기본 개념 세마포어semaphore는 프로세스 사이의 동기synchronization를 맞추는 기능을 제공한다. 예를 들어, 공유 메모리에 여러 프로세스가 동시에 쓰기를 시도한다면 데이터가 손상되는 현상이 발생한다. 따라서 여러 프로세스 사이의 동작 순서를 지정해야 한다. 프로세스들이 공유 영역에 대한 접근 순서를 정하는 방법 중 하나가 세마포어다. 세마포어의 기본 동작 구조 세마포어는 중요한 처리 부분critical section에 들어가기 전에 p 함수를 실행해 잠금 기능을 수행하고, 처리를 마치면 다시 v 함수를 실행해 잠금을 해제한다. 잠금 기능을 수행 중인 동안에는 다른 프로세스가 처리 부분의 코드를 실행할 수 없다. sem은 세마포어 값을 의미한다. p(sem); /* 잠금 */ 중..
공유 메모리 관련 함수 공유 메모리shared memory는 같은 메모리 공간을 두 개 이상의 프로세스가 공유하는 것이다. 같은 메모리 공간을 사용하므로 이를 통해 데이터를 주고받을 수 있다. 여러 프로세스가 메모리를 공유하고 있으므로 당연히 읽고 쓸 때 동기화가 필요하다. 공유 메모리를 동기화하지 않을 경우 데이터가 손실될 수 있다. 공유 메모리 생성 : shmget(2) #include #include #include int shmget(key_t key, size_t size, int shmflg); // key : IPC_PRIVATE 또는 ftok 함수로 생성한 키, size : 공유할 메모리의 크기, shmflg : 공유 메모리의 속성을 지정하는 플래그 공유 메모리 연결 : shmat(2) #..
메시지 큐 관련 함수 메시지 큐message queue는 파이프pipe와 유사하다. 단, 파이프는 스트림 기반으로 동작하고, 메시지 큐는 메시지(또는 패킷) 단위로 동작한다. 각 메시지의 최대 크기는 제한되어 있다. 각 메시지에는 메시지 유형message type이 있으므로, 수신 프로세스는 어떤 유형의 메시지를 받을 것인지 선택할 수 있다. 메시지 큐 생성 : msgget(2) #include int msgget(key_t key, int msgflg); // key : 메시지 큐를 구별하는 키, msgflg : 메시지 큐의 속성을 설정하는 플래그 메시지 전송 : msgsnd(2) #include int msgsnd(int msqid, const void *msgp, size_t msgsz, int m..
키와 식별자 시스템 V IPC에서 사용하는 키는 key_t 형으로 에 선언되어 있으며, 32비트 정수형이다. IPC를 사용하기 위해 새로운 IPC 객체를 생성할 때 키를 지정한다. 키가 다르면 서로 다른 객체가 생성된다. 각 IPC 방법의 객체 생성 함수에서 키를 받아 새로운 IPC 객체를 생성하고, 이를 식별하는 식별자를 리턴한다. 이 식별자를 사용해 통신할 수 있다. 키 생성하기 : ftok(3) #include key_t ftok(const char *path, int id); // path : 파일시스템에 이미 존재하는 임의의 파일의 경로명, id : 키 값을 생성할 때 지정하는 임의의 번호(1~255) IPC 공통 구조체 시스템 V IPC를 사용하기 위해 해당 IPC의 객체를 생성하면 IPC 공..
이름 있는 파이프 이름 있는 파이프named pipe는 글자 그대로 이름이 붙은 파이프로 모든 프로세스가 이 파이프명을 이용해 통신할 수 있다. FIFOFirst-In First-Out로 통신하려면 우선 FIFO 특수 파일을 생성하고 파일 입출력 함수를 사용하면 된다. 즉, 한 프로세스가 FIFO로 사용할 특수 파일을 생성하면, 이 파일의 이름을 알고 있는 다른 프로세스가 같은 FIFO를 이용해 통신을 수행할 수 있다. 명령으로 FIFO 파일 생성하기 FIFO·특수 파일 생성 : mknod 명령 mknod 파일명 p FIFO 파일 생성 : mkfifo 명령 /usr/bin/mkfifo [-m mode] path… 함수로 FIFO 파일 생성하기 특수 파일 생성 : mknod(2) #include int m..
간단한 파이프 생성 파이프는 두 프로세스 간에 통신을 할 수 있도록 인터페이스를 제공한다. 아무 수식어 없이 그냥 파이프라고 하면 일반적으로 이름 없는 파이프(익명 파이프)anonymous pipe를 의미한다. 이름 없는 파이프는 부모-자식 프로세스 간에 통신을 할 수 있게 해준다. 부모 프로세스에서 fork 함수를 사용해 자식 프로세스를 생성하고, 부모 프로세스와 자식 프로세스 간에 통신하는 것이다. 파이프 생성 : popen(3) #include FILE *popen(const char *command, const char *mode); // command : 쉘 명령, mode : "r" 또는 "w" 파이프 닫기 : pclose(3) #include int pclose(FILE *stream); /..
sigaction 구조체 sigaction 구조체는 에 정의되어 있으며, 구조체의 멤버는 시그널 처리를 위한 시그널 핸들러 주소, 시그널 핸들러가 수행하는 동안 블록될 시그널, 추가적인 기능을 설정할 수 있는 플래그로 구성되어 있다. struct sigaction { int sa_flags; union { void (*sa_handler)(); void (*sa_sigaction)(int, siginfo_t *, void *); } _funcptr; sigset_t sa_mask; }; sigaction 함수 sigaction 함수 : sigaction(2) #include int sigaction(int sig, const struct sigaction *restrict act, struct sigac..
시그널 집합의 개념 유닉스에서는 시그널 집합의 처리를 위해 sigset_t라는 구조체를 제공한다. sigset_t 구조체는 에 정의되어 있으며, sigset_t 구조체는 크기가 4인 unsigned int 배열을 사용한다. typedef struct { unsigned int __sigbits[4]; } sigset_t; 시그널 집합 처리 함수 시그널 집합 비우기 : sigemptyset(3) #include int sigemptyset(sigset_t *set); // set : 비우려는 시그널 집합의 주소 시그널 집합에 모든 시그널 설정 : sigfillset(3) #include int sigfillset(sigset_t *set); // set : 설정하려는 시그널 집합의 주소 시그널 집합에 시그..