sem_open 서브루틴

용도

명명된 세마포어를 초기화하고 엽니다.

라이브러리

표준 C 라이브러리(libc.a)

구문

#include <semaphore.h>

sem_t * sem_open (const char *name, int oflag, mode_t mode, unsigned value)

설명

Sem_open 서브루틴은 명명된 세마포어와 프로세스 간의 연결을 설정합니다. 세마포어 이름으로 sem_open 서브루틴을 호출한 후 프로세스는 호출에서 반환된 주소를 사용하여 세마포어를 참조할 수 있습니다. 이 세마포어는 sem_wait, sem_trywait, sem_postsem_close 서브루틴의 후속 호출에 사용될 수 있습니다. 세마포어는 sem_close, _exit 또는 실행 서브루틴 중 하나를 성공적으로 호출하여 세마포어가 닫힐 때까지 이 프로세스에서 계속 사용할 수 있습니다.

Name 매개변수는 세마포어 객체의 이름을 지정하는 문자열을 가리킵니다. 이 이름은 파일 시스템에 표시되지 않습니다. 이름 매개변수는 경로명에 대한 구성 규칙을 따릅니다. 슬래시 문자로 시작할 수 있으며 하나 이상의 문자를 포함해야 합니다. 동일한 이름의 값을 가진 sem_open() 을 호출하는 프로세스는 해당 이름이 제거되지 않은 한 동일한 세마포어 객체를 참조합니다.

프로세스가 이름 매개변수의 값이 동일한 sem_open 서브루틴을 여러 번 성공적으로 호출하는 경우, 이 세마포어에 대한 sem_unlink 서브루틴 호출이 없는 한, 각 성공적인 호출에 대해 동일한 세마포어 주소가 반환됩니다.

매개변수

항목 설명
이름 세마포어 객체의 이름을 지정하는 문자열을 가리킵니다.
oflag 세마포어를 생성할지, 아니면 sem_open 서브루틴 호출에 의해 단순히 액세스할지 제어합니다. 다음의 플래그 비트는 oflag 파라미터에 설정할 수 있습니다:
O_CREAT
이 플래그는 세마포어가 아직 존재하지 않는 경우 세마포어를 생성하는 데 사용됩니다. O_CREAT 플래그가 설정되어 있고 세마포어가 이미 존재하는 경우, O_EXCL 플래그의 설명에 명시된 경우를 제외하고는 O_CREAT 플래그는 아무런 영향을 미치지 않습니다. 그렇지 않으면 sem_open 서브루틴이 명명된 세마포어를 생성합니다. O_CREAT 플래그에는 세 번째 및 네 번째 매개변수인 mode_t 유형인 모드와 부호 없는 유형인 값이 필요합니다. 세마포어는 초기 값으로 생성됩니다. 세마포어의 유효한 초기 값은 SEM_VALUE_MAX보다 작거나 같아야 합니다.

세마포어의 사용자 ID는 프로세스의 유효 사용자 ID로 설정됩니다. 세마포어의 그룹 ID는 프로세스의 유효 그룹 ID로 설정됩니다. 세마포어의 권한 비트는 프로세스의 파일 모드 생성 마스크에 설정된 것을 제외한 모드 매개변수의 값으로 설정됩니다. 파일 권한 비트가 아닌 다른 모드의 비트가 설정된 경우 해당 비트는 아무런 영향을 미치지 않습니다. 파일 권한 비트가 아닌 다른 모드의 비트가 설정된 경우 해당 비트는 아무런 영향을 미치지 않습니다.

Sem_open 서브루틴이 O_CREAT 플래그를 사용하여 name이라는 이름의 세마포어를 생성한 후, 다른 프로세스는 같은 이름의 값을 가진 sem_open 서브루틴을 호출하여 세마포어에 연결할 수 있습니다.

O_EXCL
O_EXCLO_CREAT 플래그가 설정된 경우, 세마포어 이름이 존재하면 sem_open 서브루틴이 실패합니다. 세마포어의 존재 여부 확인과 존재하지 않는 경우 세마포어를 생성하는 것은 O_EXCLO_CREAT 플래그가 설정된 상태에서 sem_open 서브루틴을 실행하는 다른 프로세스에 대해 원자적인 작업입니다. O_EXCL이 설정되어 있고 O_CREAT가 설정되어 있지 않으면 O_EXCL은 무시됩니다. Oflag 매개변수에 O_CREATO_EXCL 이외의 플래그를 지정한 경우 해당 플래그는 영향을 미치지 않습니다.
모드 파일 권한 비트의 값을 지정합니다. 메시지 큐를 만들 때 O_CREAT와 함께 사용됩니다.
초기 값을 지정합니다. 메시지 큐를 만들 때 O_CREAT와 함께 사용됩니다.

리턴 값

성공적으로 완료되면 sem_open 서브루틴은 세마포어의 주소를 반환합니다. 그렇지 않으면 SEM_FAILED 값을 반환하고 errno를 설정하여 오류를 표시합니다. SEM_FAILED 심볼은 semaphore.h 헤더 파일에 정의되어 있습니다. Sem_open 서브루틴에서 성공적으로 반환되지 않으면 SEM_FAILED 값이 반환됩니다.

오류 코드

다음 조건 중 하나라도 발생하면 sem_open 서브루틴은 SEM_FAILED를 반환하고 errno를 해당 값으로 설정합니다:
항목 설명
EACCES 명명된 세마포어가 존재하며 오브젝트 지연으로 지정된 권한이 거부됩니다.
EEXIST O_CREATO_EXCL 플래그가 설정되어 있고 명명된 세마포어가 이미 존재합니다.
기본값 잘못된 사용자 주소입니다.
EINVAL 주어진 이름에 대해 sem_open 서브루틴이 지원되지 않거나, oflag 매개변수에 O_CREAT 플래그가 지정되었고 값이 SEM_VALUE_MAX보다 큰 경우입니다.
EMFILE 현재 이 프로세스에서 너무 많은 세마포어 기술자가 사용되고 있습니다.
ENAMETOOLONG 이름 매개변수의 길이가 PATH_MAX를 초과하거나 경로 이름 구성 요소가 NAME_MAX보다 깁니다.
ENFILE 현재 시스템에 너무 많은 세마포어가 열려 있습니다.
ENOENT O_CREAT 플래그가 설정되지 않았고 명명된 세마포어가 존재하지 않습니다.
ENOMEM 필요한 작업에 필요한 메모리가 부족합니다.
ENOTSUP 이 기능은 체크포인트 재시작된 프로세스에서는 지원되지 않습니다.
ENOSPC 새 명명된 세마포어를 생성할 공간이 부족합니다.