У меня была эта проблема недавно с OS X. Решение, которое я нашел, состояло в том, чтобы отключить разделяемую память, а затем снова создать ее. Вы также можете попробовать перезагрузить, поскольку, по крайней мере, для Linux семафоры стиля POSIX являются стойкими ядрами.
POSIX названные семафоры имеют стойкость ядра: если не удалить sem_unlink (3), семафор будет существовать до тех пор, пока система не будет закрыта.
Проблема возникает, когда вы пытаетесь создать общую память с предоставлением неправильных разрешений для режима или, возможно, вообще отсутствием режима. Когда вы затем исправляете проблему и пытаетесь открыть семафор, она все еще использует исходный семафор, который был сохранен.
Так попробуйте сделать:
#define SHAREDSEM "/sharedSem"
sem_unlink(SHAREDSEM);
sem_t *sharedSem = sem_open(SHAREDSEM, O_CREAT, 0777, 1);
Если это единственное место, которое вы хотите создать семафор, то можно дополнительно добавить в O_EXCL
вариант, который делает его ошибкой, если семафор уже существует. Это может быть полезно, по крайней мере, для отладки, чтобы убедиться, что это проблема, с которой вы сталкиваетесь.
Чтобы сделать это попробовать:
#define SHAREDSEM "/sharedSem"
sem_unlink(SHAREDSEM);
sem_t *sharedSem = sem_open(SHAREDSEM, O_CREAT | O_EXCL, 0777, 1);
Обратите внимание, что в этих примерах я установить разрешения на 0777, так что она доступна всем. Это полезно для отладки. В вашей последней реализации не забудьте вернуть его к соответствующим разрешениям, которые вам нужны.
пользователь1305858, Вы нашли это решение? – Robin