기존 명명된 세마포어를 여는 방법은 무엇입니까?

기존 명명된 세마포어를 여는 방법은 무엇입니까?

분명히 기존 세마포어를 열 때는 필요하지 않습니다 O_CREAT.O_EXCL

O_CREAT새로운 세마포어를 생성할 때 필요합니다.

O_EXCLO_CREAT는 주어진 이름의 세마포어가 이미 존재하는 경우 오류가 반환되도록 지정하여 와 OR을 수행할 때만 의미가 있습니다 .

sem_open에 대한 Linux 매뉴얼 페이지그렇게 말했다

플래그 값의 정의는 <fcntl.h>를 포함하여 얻을 수 있습니다.

하지만 나는 어떤 깃발도 발견하지 못했습니다fcntl.h기존 세마포어를 여는 방법을 알려주었습니다.

답변1

다음 예를 고려하십시오.

#include <fcntl.h>
#include <sys/stat.h>
#include <semaphore.h>
#include <stdio.h>

int main(int argc, char* argv[])
{
    const char* const sem_name = "lock.sem";

    if (argc == 1) {
        sem_t* const sem = sem_open(sem_name, O_CREAT, 0644, 0);

        if (sem == NULL) {
            perror("sem_open");
            return 1;
        }

        sem_wait(sem); // Will block
        sem_close(sem);

        sem_unlink(sem_name);
    } else {
        sem_t* const sem = sem_open(sem_name, 0);

        if (sem == NULL) {
            perror("sem_open");
            return 1;
        }

        sem_post(sem); // Will unblock the other process
        sem_close(sem);
    }

    return 0;
}

나는 프로그램의 동작을 제어하기 위해 인수 개수를 사용하고 있습니다.

매개변수를 제공하지 않으면(즉, argc == 1), 프로그램은 세마포어를 열고, 아직 존재하지 않는 경우 이를 생성합니다. 세마포어의 값을 로 초기화합니다 0. 그런 다음 개체 sem_wait()에 대해 작업을 수행합니다 sem. 세마포어가 로 초기화되었으므로 0이로 인해 프로세스가 차단됩니다.

이제 동일한 프로그램의 두 번째 인스턴스를 실행하지만 이번에는 0이 아닌 인수 수(즉, when argc != 1)를 사용하여 실행하면 프로그램은 세마포어를 열지만 아직 존재하지 않으면 생성하지 않습니다. 여기서는 매개변수 0를 전달한다는 점에 유의하세요 oflag(즉, 플래그를 전달하지 않음). 그런 다음 프로그램은 을 수행하여 sem_post()세마포어를 에서 으로 증가 0시킵니다 1. 그러면 첫 번째 프로세스의 차단이 해제됩니다. 두 프로세스 모두 세마포어에 대한 참조를 닫고 종료됩니다.

귀하의 질문을 올바르게 이해했다면 두 번째 경우가 귀하가 찾고 있는 것입니다.

두 번째 사례를 먼저 실행하려고 하면(즉, 첫 번째 사례의 실행 중인 인스턴스가 없는 경우) 다음과 같은 결과가 나타납니다.

$ ./a.out foo
sem_open: No such file or directory

perror()해당 이름을 가진 세마포어가 존재하지 않기 때문에 호출에서 발생합니다 .

관련 정보