[Philosophers] Day 05. 보너스 파트 함수 공부 - Semaphore

jkeum·2021년 6월 21일
2

philosophers

목록 보기
5/5

허용 함수

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


함수 설명

sem 함수

#include <semaphore.h>

  1. sem_open

    세마포어를 초기화하고 여는 함수이다.
  • 함수 원형
    sem_t *sem_open(const char *name, int oflag, ...);
  • const char *name
    : 세마포어 객체에 이름을 지정하는 문자열
  • int oflag
    : 세마포어를 생성하는지 혹은 접근만 가능한지 여부를 설정하는 값
  • oflag의 값은 다음 값으로 구성된다.
    O_CREAT
    : 존재하지 않는 경우 세마포어를 생성한다. 이 플래그는 추가적으로 2개의 인수를 필요로 한다.
    mode_tmodeunsignedvalue이다.
    세마포어는 value의 값을 초기값으로 생성한다. valueSEM_VALUE_MAX와 같거나 작은 값을 가져야 한다.
    O_EXCL : 만일 O_EXCLO_CREAT이 설정되었고 세마포어의 이름이 존재한다면 sem_open() 함수는 실행에 실패한다. 만일 O_EXCL은 설정되었고 O_CREAT가 설정되지 않은 경우에는 함수 실행에 대한 결과가 정의되지 않는다.
  • O_CREATO_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_CREATO_EXCL이 설정되고, 이름이 명명된 세마포어가 이미 존재하는 경우
    ◦ EINTR
    : sem_open() 함수 실행이 시그널에 의해 중단된 경우
  1. sem_close

    세마포어를 종료한다.
  • 함수 원형
    int sem_close(sem_t *sem);
  • sem_t *sem
    : 종료해야 할 이름이 명명된 세마포어
  • 호출 중인 프로세스가 sem이 가리키는 세마포어를 사용하여 종료되도록 지시한다.
  • 이름이 명명되지 않은 세마포어를 sem_close()를 사용하여 종료했을 때는 그 결과가 정의되어있지 않다.
  • 이 함수는 프로세스가 세마포어를 사용하도록 시스템이 할당한 자원을 전부 할당 해제한다.
  • 반환 값
    성공일 경우 0을 반환한다. 그렇지 않으면 -1을 반환하고 errno 값을 설정하여 오류를 표시한다.
  • 오류 값
    다음의 경우에 실패한다.
    EINVAL
    : sem이 유효하지 않은 세마포어를 참조하는 경우
  1. sem_post

    세마포어의 잠금을 해제한다.
  • 함수 원형
    int sem_post(sem_t *sem);
  • sem_t *sem
    : 잠금을 해제할 세마포어
  • sem으로 참조된 세마포어의 잠금을 해제한다.
  • 함수 실행의 결과 세마포어의 값이 양수일 경우에 세마포어가 해제되기를 기다리며, 차단된 스레드가 없다. 세마포어의 값은 증가한다.
    만일 함수 실행의 결과 세마포어의 값이 0인 경우, 차단된 스레드들 중 하나가 sem_wait()의 호출로부터 성공적으로 반환하도록 세마포어가 허용된 것이다.
  • 반환 값
    성공할 경우 0을 반환한다. 그렇지 않으면 -1을 반환하고 errno 값을 설정하여 오류를 표시한다.
  • 오류 값
    다음의 경우에 실패한다.
    EINVAL
    : sem이 유효하지 않은 세마포어를 참조하는 경우
  1. sem_wait

    세마포어를 잠근다.
  • 함수 원형
    int sem_wait(sem_t *sem);
  • sem_t *sem
    : 잠궈야 할 세마포어
  • 만일 현재의 세마포어의 값이 0이라면, 호출하는 스레드는 세마포어를 잠그거나 시그널에 의해서 호출이 중단되기 전까지 sem_wait()으로부터 돌아오지 않는다.
  • 함수가 성공적으로 실행되면 세마포어의 상태는 잠금상태가 되며, sem_post()로 잠금을 해제하기 전까지 잠금상태를 유지한다.
  • 반환 값
    성공할 경우 0을 반환한다. 그렇지 않으면 -1을 반환하고 errno 값을 설정하여 오류를 표시한다.
  • 오류 값
    다음의 경우에 실패한다.
    EDEADLK
    : 데드락 상태가 감지되는 경우
    EINTR
    : 시그널 함수 실행을 중단하는 경우
    EINVAL
    : sem이 유효하지 않은 세마포어를 참조하는 경우
  1. sem_unlink

    이름이 명명된 세마포어를 제거한다.
  • 함수 원형
    int sem_unlink(const char *name);
  • const char *name
    : 제거해야 할 세마포어의 이름
  • 현재 name으로 명명된 세마포어가 어떤 프로세스에 의해 참조되고 있다면, 이 함수는 해당 세마포어에 영향을 미치지 않는다. 만약 하나 이상의 프로세스가 이 함수를 호출했을 때, 해당 세마포어를 열고 있다면 모든 참조되고 있는 세마포어가 sem_close() 등에 의해 종료될 때까지 세마포어의 제거는 연기된다.
  • 반환 값
    성공할 경우 0을 반환한다. 그렇지 않으면 -1을 반환하고 errno 값을 설정하여 오류를 표시한다.
  • 오류 값
    다음의 경우에 실패한다.
    EACCES
    : 이름이 있는 세마포어를 제거하기 위한 권한이 없는 경우
    ENOENT
    : 해당 이름의 세마포어가 존재하지 않는 경우

그 외 함수

  1. fork
  • 헤더 : <unistd.h>
  • 함수 원형 : pid_t fork(void);
  • 반환 값
    자식 프로세스에는 0을 반환하고 부모 프로세스에는 0보다 큰 값의 자식 프로세스 pid를 반환한다. 실패한 경우 -1을 반환한다.
  • 이 함수를 호출한 프로세스는 부모 프로세스가 되고, 새롭게 생성되는 프로세스는 자식 프로세스가 된다. 자식 프로세스는 부모 프로세스의 메모리를 그대로 복사하여 가지게 되며 함수 호출 이후부터는 각자의 메모리를 사용하게 된다.
  1. kill
  • 헤더 : <signal.h>
  • 함수 원형 : int kill(pid_t pid, int sig);
  • pid_t pid : 시그널을 보낼 프로세스 id
  • int sig : 시그널 번호
  • 반환 값
    성공할 경우 0을 반환하고, 실패한 경우 -1을 반환한다.
  • 프로세스에 시그널을 전달한다. 무조건 프로세스를 죽이는 함수가 아니다. sigSIGKILL을 보내면 kill 명령어와 같은 역할을 한다.
  • pid에 양수값을 보내면 그 프로세스 ID에만 시그널을 전송한다. 0을 보내면 함수를 호출하는 프로세스와 같은 그룹에 있는 모든 프로세스에 시그널을 전송한다. -1을 보내면 함수를 호출하는 프로세스가 전송할 수 있는 권한을 가진 모든 프로세스에 시그널을 전송한다. 그 외의 음수값을 보내면 pid의 절대값 프로세스 그룹에 속하는 모든 프로세스에 시그널을 전송한다.
  1. 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) - 프로세스 종료하기

profile
It's me, jkeum!

0개의 댓글