written by yechoi

[C] sem_open 이란? (인자, 이름 '/' 유무 차이 등) 본문

Born 2 Code/C, C++

[C] sem_open 이란? (인자, 이름 '/' 유무 차이 등)

yechoi 2020. 12. 10. 13:09
반응형

선언

sem_t * sem_open( const char * sem_name,
                  int oflags,
                  ... );

 

 

인자

sem_name

생성 또는 접근하고자 하는 세마포어의 이름

 

oflags

세마포어 생성시 플래그. 아래 두가지 조합으로 사용 가능:

  • O_CREAT
  • O_EXCL

!! O_RDONLY, O_RDWR, O_WRONLY 플래그는 undefined behavior를 일으킴. QNX 라이브러리는 이러한 플래그를 무시하긴 하지만 이들은 코드의 휴대성을 저하함

 

mode_t mode

플래그를 O_CREAT로 설정하면, mode 인자를 받을 수 있음. <sys/stat.h> 를 인클루드 하면 아래 상수들을 활용할 수 있다.

  • S_IRWXR : 그룹 접근
  • S_IRWXO : 타인 접근
  • S_IRWXU : 개인 접근

 

unsigned int value

세마포어 초기 값으로 0 보다 큰 양수여야 함. unlock된 세마포어의 수를 의미한다. 이 값은 SEM_VALUE_MAX를 초과할 수 없다.

 

 

설명

sem_open() 은 이름 있는 세마포어를 생성하거나 접근하게끔 한다. 이름 있는 세마포어는 sem_init() 으로 생성되는 무명 세마포어보다 느리다. 세마포어는 시스템이 살아있기만 하면 계속 존재한다.

sem_open()은 세마포어 디스크립터를 반환하는데, 이는 sem_wait(), sem_trywait(), sem_post() 를 활용하는 데 사용할 수 있다. 디스크립터는 sem_close() 를 호출할 때까지 사용가능하다. 세마포어를 언링크하려면 sem_unlink()를 호출하면 된다. 모든 프로세스가 세마포어를 언링크하면, 세마포어는 파괴된다.

이름 있는 세마포어는 항상 /dev/sem 경로에 생성된다:

  • 이름이 /로 시작하면 세마포어는 그 이름으로 지어진다.
  • 이름이 /로 시작하지 않으면, 세마포어는 그 이름으로 지어지되 현재 경로 아래에 만들어진다.

예를 들어 만약 현재 디렉토리가 /tmp 라면:

name pathname space entry
/my_sem /dev/sem/my_sem
My_sem /dev/sem/tmp/my_sem
반응형