O_CREAT
분명히 및 기존 세마포어를 열 때는 O_EXCL
필요하지 않습니다 .
O_CREAT
새 세마포어를 생성할 때 필요합니다.
O_EXCL
와 OR로 연결된 경우에만 의미가 있으며 O_CREAT
, 지정된 이름의 세마포어가 이미 존재하는 경우 오류가 반환되도록 지정합니다.
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;
}
나는 프로그램의 동작을 제어하기 위해 매개변수 계산을 사용합니다.
인수를 제공하지 않으면(즉, when 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()
해당 이름의 세마포어가 존재하지 않기 때문에 호출에서 발생합니다 .