![기존 명명된 세마포어를 여는 방법은 무엇입니까?](https://linux55.com/image/191883/%EA%B8%B0%EC%A1%B4%20%EB%AA%85%EB%AA%85%EB%90%9C%20%EC%84%B8%EB%A7%88%ED%8F%AC%EC%96%B4%EB%A5%BC%20%EC%97%AC%EB%8A%94%20%EB%B0%A9%EB%B2%95%EC%9D%80%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
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()
해당 이름의 세마포어가 존재하지 않기 때문에 호출에서 발생합니다 .