posix 익명 세마포어 예제

sem_wait() 함수는 해당 세마포에 세마포 잠금 작업을 수행하여 sem에서 참조하는 세마포를 잠급니다. 세마포 값이 현재 0이면 호출 스레드는 세마포를 잠그거나 신호에 의해 호출이 중단될 때까지 sem_wait()로 호출에서 반환되지 않습니다. sem_init() 함수는 sem에 의해 언급된 명명되지 않은 세마포를 초기화한다. 초기화 세마포의 값은 값이어야 한다. sem_init()에 대한 성공적인 호출 후, 세마포는 sem_wait(), sem_timewait(), sem_trywait(), sem_post() 및 sem_destroy()에 대한 후속 호출에 사용될 수 있습니다. 이 세마포는 세마포가 파괴 될 때까지 사용할 수 있습니다. sem_open은 세마포를 시작하기 위한 호출입니다. sem_open기존 세마포를 열거나 새 세마포를 생성하고 추가 작업을 위해 엽니다. 첫 번째 매개 변수 인 이름은 앞에서 설명한 대로 세마포의 이름입니다. oflag는 O_CREAT을 가질 수 있으며, 이 경우 세마포가 이미 존재하지 않으면 생성됩니다. O_CREAT 및 O_EXCL을 모두 지정하면 지정된 이름의 세마포가 이미 있는 경우 호출에 오류가 발생합니다.

oflags 매개 변수에 O_CREAT 집합이 있는 경우 두 번째 형식의 sem_open을 사용해야 하며 두 개의 추가 매개 변수, 모드 및 값을 지정해야 합니다. 모드 매개 변수는 파일에 대한 열린 시스템 호출의 모드와 유사하게 프로세스에 대한 umask로 마스크되는 세마포에 대한 권한을 지정합니다. 마지막 매개 변수인 값은 세마포에 대한 초기 값입니다. O_CREAT이 oflag에 지정되고 세마포가 이미 존재하는 경우 모드 및 값 매개 변수는 모두 무시됩니다. 리눅스에서 POSIX 세마포어는 /dev/shm 디렉토리 아래에 생성됩니다. 세마포어는 접두사, sem. 그 다음에 sem_open 호출에 전달된 이름으로 명명됩니다. 스레드가 현재 차단되지 않은 초기화 된 세마포를 파괴하는 것이 안전합니다. 다른 스레드가 현재 차단된 세마포를 파괴하는 효과는 정의되지 않습니다.

sem_open(3) 함수는 새 세마포를 만들거나 기존 명명된 세마포를 엽니다. 세마포를 연 후, sem_post(3) 및 sem_wait(3)를 사용하여 조작할 수 있다. 세마포를 사용하여 프로세스가 완료되면 sem_close(3)를 사용하여 세마포를 닫을 수 있습니다. 세마포를 사용하여 모든 프로세스가 완료되면 sem_unlink(3)를 사용하여 시스템에서 제거할 수 있습니다. POSIX 세마포 호출은 System V 세마포 호출보다 훨씬 간단합니다. 그러나 System V 세마포는 특히 이전 유닉스와 같은 시스템에서 더 널리 사용할 수 있습니다. POSIX 세마포는 glibc를 사용하는 리눅스 시스템 포스트 버전 2.6에서 사용할 수 있습니다. POSIX 세마포에는 이름과 이름 없는 두 가지 유형이 있습니다. 용어에서 알 수 있듯이 명명된 세마포어에는 형식 /somename의 이름이 있습니다.

첫 번째 문자는 앞으로 슬래시이며, 그 다음에 하나 이상의 문자가 있으며, 그 중 어느 것도 슬래시가 되지 않습니다. 먼저 명명된 세마포와 이름 없는 세마포를 살펴보겠습니다. sem_wait 는 sem으로 가리키는 세마포를 감소시킴을 감소시킴을 감소시킴을 감소시킴을 감소시킴을 감소시킴을 감소시킴. 세마포 값이 0이 아닌 경우 즉시 감소가 발생합니다. 세마포 값이 0이면 세마포가 0보다 크고 감소가 완료될 때까지 호출 블록이 차단됩니다. sem_wait는 성공 시 0을, 오류는 -1을 반환합니다. 오류가 발생하면 세마포 값이 변경되지 않고 errno가 적절한 오류 번호로 설정됩니다. sem_wait는 세마포에 대한 P 연산을 요청합니다. 사용하기 전에 이름 없는 세마포를 sem_init(3)을 사용하여 초기화해야 합니다.

그런 다음 sem_post(3) 및 sem_wait(3)를 사용하여 작동할 수 있습니다. 세마포가 더 이상 필요하지 않고 세마포가 있는 메모리가 할당되기 전에 sem_destroy(3)를 사용하여 세마포를 파괴해야 합니다. 세마포의 기본 코드는 여기에 제시된 대로 간단합니다. 그러나 함수가 원자성이어야하고 코드를 직접 작성하면 함수완료없이 컨텍스트 전환이 발생하여 혼란이 발생할 수 있기 때문에이 코드를 직접 작성할 수 없습니다.