Я экспериментирую с именованными семафорами, и есть кое-что, чего я не понимаю в поведении sem_close
и sem_destroy
. В моем примере это выглядит так, как будто созданный семафор не удаляется.
#include <iostream>
#include <semaphore.h>
int main() {
char sem_name[] = "/sem-1";
{
sem_t *sptr = sem_open(sem_name, O_CREAT, 0644, 0);
if (sptr != SEM_FAILED) {
printf("sem_open success\n");
// neither of these works
sem_close(sptr);
// sem_destroy(sptr);
} else {
printf("sem_open error #1: %s\n", strerror(errno));
}
}
sem_t *sptr = sem_open(sem_name, O_CREAT | O_EXCL, 0644, 0);
printf("sem_open error #2: %s\n", strerror(errno));
assert(sptr != SEM_FAILED);
return 0;
}
Вывод:
sem_open success
sem_open error #2: File exists
Assertion failed: (sptr != SEM_FAILED), function main, file /tmp/delete_me/main.cpp, line 22.
Я ожидаю, что утверждение не будет выполнено, а также ошибка № 2 не отображается.
Кроме того, macOS говорит, что метод sem_destroy
устарел, но я все еще использую и sem_close()
, и sem_destroy
, но они оба, похоже, не удаляют семафор.
Справочная информация: я пытаюсь перенести Core Flight System NASA на macOS. Их реализация POSIX использует вызовы sem_
, и я пытаюсь понять, смогу ли я заставить их работать на macOS с некоторыми незначительными изменениями.