2013-02-23 3 views
1

Я пытаюсь создать простой семафор, который можно разделить между процессами. Моя основная программа вызывает следующую функцию для создания семафора.Разрешение семафора отклонено

#define SHAREDSEM "/sharedSem" 
sem_t *sharedSem = sem_open(SHAREDSEM, O_CREAT, 0644, 1); 

Однако, я получаю сообщение об ошибке «Permission Denied». Я запускаю этот код в Mac OS X, и я понимаю, что он не поддерживает неназванные семафоры. Но я уверен, что sem_open для названных семафоров.

Я пробовал использовать разные t_mode без успеха.

Кто-нибудь еще столкнулся с этой проблемой и может помочь?

+0

пользователь1305858, Вы нашли это решение? – Robin

ответ

4

У меня была эта проблема недавно с 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, так что она доступна всем. Это полезно для отладки. В вашей последней реализации не забудьте вернуть его к соответствующим разрешениям, которые вам нужны.

+0

В Linux я не мог видеть семафор или соответствующую общую память с помощью ipcs. Однако перезапуск устраняет проблему. Старое решение IT Crowd. – teambob

Смежные вопросы