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_open
sem_t *sem_open(const char *name, int oflag, ...);
const char *name
int oflag
oflag
의 값은 다음 값으로 구성된다.O_CREAT
mode_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
를 해당 오류 값으로 설정한다.EACCES
oflag
에 명시된 권한이 정의되어 있거나, 이름이 정의된 세마포어가 존재하지 않고 이름이 명명된 세마포어를 생성할 권한이 거부된 경우EEXIST
O_CREAT
와 O_EXCL
이 설정되고, 이름이 명명된 세마포어가 이미 존재하는 경우sem_open()
함수 실행이 시그널에 의해 중단된 경우sem_close
int sem_close(sem_t *sem);
sem_t *sem
sem
이 가리키는 세마포어를 사용하여 종료되도록 지시한다.sem_close()
를 사용하여 종료했을 때는 그 결과가 정의되어있지 않다.errno
값을 설정하여 오류를 표시한다.EINVAL
sem
이 유효하지 않은 세마포어를 참조하는 경우sem_post
int sem_post(sem_t *sem);
sem_t *sem
sem
으로 참조된 세마포어의 잠금을 해제한다.sem_wait()
의 호출로부터 성공적으로 반환하도록 세마포어가 허용된 것이다.errno
값을 설정하여 오류를 표시한다.EINVAL
sem
이 유효하지 않은 세마포어를 참조하는 경우sem_wait
int sem_wait(sem_t *sem);
sem_t *sem
sem_wait()
으로부터 돌아오지 않는다.sem_post()
로 잠금을 해제하기 전까지 잠금상태를 유지한다.errno
값을 설정하여 오류를 표시한다.EDEADLK
EINTR
EINVAL
sem
이 유효하지 않은 세마포어를 참조하는 경우sem_unlink
int sem_unlink(const char *name);
const char *name
name
으로 명명된 세마포어가 어떤 프로세스에 의해 참조되고 있다면, 이 함수는 해당 세마포어에 영향을 미치지 않는다. 만약 하나 이상의 프로세스가 이 함수를 호출했을 때, 해당 세마포어를 열고 있다면 모든 참조되고 있는 세마포어가 sem_close()
등에 의해 종료될 때까지 세마포어의 제거는 연기된다.errno
값을 설정하여 오류를 표시한다.EACCES
ENOENT
fork
<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) - 프로세스 종료하기