분명히 기존 세마포어를 열 때는 필요하지 않습니다 O_CREAT
.O_EXCL
O_CREAT
새로운 세마포어를 생성할 때 필요합니다.
O_EXCL
O_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()
해당 이름을 가진 세마포어가 존재하지 않기 때문에 호출에서 발생합니다 .