memset, printf, malloc, free, write,
fork, kill, exit,
pthread_create, pthread_detach, pthread_join,
usleep, gettimeofday, waitpid,
sem_open, sem_close, sem_post, sem_wait, sem_unlink
#include <semaphore.h>
sem_opensem_t *sem_open(const char *name, int oflag, ...);const char *nameint oflagoflag의 값은 다음 값으로 구성된다.O_CREATmode_t인 mode와 unsigned형 value이다.value의 값을 초기값으로 생성한다. value는 SEM_VALUE_MAX와 같거나 작은 값을 가져야 한다.O_EXCL : 만일 O_EXCL과 O_CREAT이 설정되었고 세마포어의 이름이 존재한다면 sem_open() 함수는 실행에 실패한다. 만일 O_EXCL은 설정되었고 O_CREAT가 설정되지 않은 경우에는 함수 실행에 대한 결과가 정의되지 않는다.O_CREAT와 O_EXCL 이외의 플래그가 oflag에 설정된 경우의 함수 실행 결과는 정의되지 않는다.name으로 이름이 지정된 세마포어는 인수 oflag에 지정된대로 초기화되어 생성되고 세마포어 설명자가 호출 프로세스로 반환된다./로 시작하면, 세마포어는 /dev/sem/ 폴더에 생성된다. (/dev/sem/name)/로 시작하지 않으면, 세마포어는 /dev/sem/현재폴더/ 폴더에 생성된다. (/dev/sem/현재폴더/name)sem_close() 등을 호출하여 세마포어를 닫기 전까지 사용할 수 있다.sem_open()은 세마포어 주소를 반환한다. 그렇지 않을 경우, SEM_FAILED를 반환하고 errno에 오류를 설정한다.sem_open()은 SEM_FAILED을 반환하고 errno를 해당 오류 값으로 설정한다.EACCESoflag에 명시된 권한이 정의되어 있거나, 이름이 정의된 세마포어가 존재하지 않고 이름이 명명된 세마포어를 생성할 권한이 거부된 경우EEXISTO_CREAT와 O_EXCL이 설정되고, 이름이 명명된 세마포어가 이미 존재하는 경우sem_open() 함수 실행이 시그널에 의해 중단된 경우sem_closeint sem_close(sem_t *sem);sem_t *semsem이 가리키는 세마포어를 사용하여 종료되도록 지시한다.sem_close()를 사용하여 종료했을 때는 그 결과가 정의되어있지 않다.errno 값을 설정하여 오류를 표시한다.EINVALsem이 유효하지 않은 세마포어를 참조하는 경우sem_postint sem_post(sem_t *sem);sem_t *semsem으로 참조된 세마포어의 잠금을 해제한다.sem_wait()의 호출로부터 성공적으로 반환하도록 세마포어가 허용된 것이다.errno 값을 설정하여 오류를 표시한다.EINVALsem이 유효하지 않은 세마포어를 참조하는 경우sem_waitint sem_wait(sem_t *sem);sem_t *semsem_wait()으로부터 돌아오지 않는다.sem_post()로 잠금을 해제하기 전까지 잠금상태를 유지한다.errno 값을 설정하여 오류를 표시한다.EDEADLKEINTREINVALsem이 유효하지 않은 세마포어를 참조하는 경우sem_unlinkint sem_unlink(const char *name);const char *namename으로 명명된 세마포어가 어떤 프로세스에 의해 참조되고 있다면, 이 함수는 해당 세마포어에 영향을 미치지 않는다. 만약 하나 이상의 프로세스가 이 함수를 호출했을 때, 해당 세마포어를 열고 있다면 모든 참조되고 있는 세마포어가 sem_close() 등에 의해 종료될 때까지 세마포어의 제거는 연기된다.errno 값을 설정하여 오류를 표시한다.EACCESENOENTfork<unistd.h>pid_t fork(void);pid를 반환한다. 실패한 경우 -1을 반환한다.kill<signal.h>int kill(pid_t pid, int sig);pid_t pid : 시그널을 보낼 프로세스 idint sig : 시그널 번호sig에 SIGKILL을 보내면 kill 명령어와 같은 역할을 한다.pid에 양수값을 보내면 그 프로세스 ID에만 시그널을 전송한다. 0을 보내면 함수를 호출하는 프로세스와 같은 그룹에 있는 모든 프로세스에 시그널을 전송한다. -1을 보내면 함수를 호출하는 프로세스가 전송할 수 있는 권한을 가진 모든 프로세스에 시그널을 전송한다. 그 외의 음수값을 보내면 pid의 절대값 프로세스 그룹에 속하는 모든 프로세스에 시그널을 전송한다.exit<stdlib.h>void exit(int status);int status : 부모 프로세스로 넘겨줄 값을 세팅한다. 0이면 정상종료로 인식한다.또 새로운 함수를 공부해야 해서 힘들었다.
함수 설명을 보는데 세마포어가 그래서 뭐지..? 싶어서 감이 잡히지 않았는데, hyunlee님이 설명해주셔서 이해할 수 있었다.
음 Day 05도 개뻥이고 사실 Day 10 정도는 되는데 다음 블로그를 또 쓸지 모르겠군
참고한 사이트:
세마포어 <semaphore.h> - - NEOS POSIX 함수 설명서
리눅스 환경에서 fork() 함수를 이용한 자식 프로세스 생성하기 :: 아니요 호얀데요
fork 함수 사용하여 프로세스 생성 :: 개발여행기
C언어 kill 시그널 전송 함수 kill() :: 바다야크
IT 개발자 Note :: exit(3) - 프로세스 종료하기