Программа печатает Unable to set semaphore value: permission denied
.
Это происходит потому, что в случае, если вызов semget()
, который вы представляете, фактически создает новый набор семафоров, он создает его безправа доступа для всех.Вы, вероятно, хотите что-то вроде этого:
*semid = semget(KEY, 1, IPC_CREAT | S_IRUSR | S_IWUSR);
Это назначит режим 0600;добавьте больше разрешений по мере необходимости.Макросы S_
документируются с помощью функции open()
.
Одна вещь, которую я должен упомянуть, это то, что, похоже, существуют процессы, выполняющиеся в фоновом режиме по сравнению с предыдущими разами, когда я запускал программу,но он не позволит мне завершить их (в нем говорится, что операция не разрешена), поэтому, возможно, семафор уже инициализирован, и он не позволит мне повторно инициализировать его?
Я не вижу никакой причиныпочему конкретная программа, которую вы представили, будет продолжать работать в фоновом режиме, но любой созданный ею набор семафоров имеет постоянство ядра: он живет до тех пор, пока не будет явно удален, что будет после завершения вашей конкретной программы.Вы должны быть в состоянии использовать команду ipcs
, чтобы получить список текущих семафоров, и команду ipcrm
, чтобы удалить старые.Для этого может потребоваться привилегия root.
Первый пример передает IPC_CREAT | IPC_EXCL | 0666
в sem_get
, но когда я это делаю, полугет возвращается -1.Это работает, только если передано только IPC_CREAT
.
Это снова проблема, которую ваш семафор установил после программы.Когда вы указываете IPC_EXCL
, вы явно запрашиваете сбой вызова (возвращая -1), если семафор с заданным ключом уже существует и, следовательно, не создается заново вызовом.Не должно быть вредно включать биты режима (0666
) при пропуске IPC_EXCL
, но они действуют только при создании нового набора семафоров.Константы S_IRUSR
и S_IWUSR
, на которые я ссылался выше, представляют два конкретных бита режима, и в целом я рекомендую использовать константы для числового кодирования режима.
В качестве отступления обратите внимание, что ftok()
Функция - это обычное средство для получения значения ключа, с помощью которого можно идентифицировать набор семафоров.