Почему semget () вызывает ошибку EACCES при * создании * семафора? - PullRequest
1 голос
/ 13 ноября 2011

Я должен сделать массив семафоров для проекта C ++.Я не звоню semget() с main();У меня есть отдельный метод, чтобы сделать это проще, хотя метод в main.cpp.Когда моя программа достигает semget(semkey,nsems,0666|IPC_CREAT), она возвращает -1 с ошибкой EACCES, что, по-видимому, означает «Идентификатор семафора существует для key, но разрешение операции, как указано младшими 9 битами semflg, не будет предоставлено. "

Я перебирал свой код в GDB.Все три параметра для semget() выглядят правильно, и это первая точка, в которой программа вызывает semget(), поэтому семафор уже не существует;Я даже побежал ipcs -s, чтобы убедиться.У меня #include <sys/sem.h> на вершине main.cpp.

Что здесь происходит?Я уже создал и прикрепил сегмент общей памяти, может ли это иметь какое-то отношение к этому?Я не вижу как.

1 Ответ

1 голос
/ 18 января 2012

Из руководства:

 EACCES A semaphore set exists for key, but the calling process does not have permission to 
        access the set, and does not have the CAP_IPC_OWNER capability.

В качестве напоминания, поскольку семафор является системным объектом, он удаляется только в том случае, если для этого явно выполнен системный вызов.(semctl с командой IPC_RMID или ipcrm term).Кроме того, semkey должен быть уникальным (например, извлекаться из функции ftok()), или возможно, что другая программа создала его до вашего первого вызова semget.Поскольку он существует, вы бы поймали так называемую ошибку EACCES, поскольку не все программы используют разрешение 0666 для семафора, как вы.

Перезагрузка сбрасывает пул общих объектов (семафор, сегменты общей памяти,очередь сообщений) как бы:

#!/bin/bash
for i in `ipcs -s | cut -f 2 -d ' '`
do
   ipcrm -s $i
done

for i in `ipcs -m | cut -f 2 -d ' '`
do
   ipcrm -m $i
done

for i in `ipcs -q | cut -f 2 -d ' '`
do
   ipcrm -q $i
done
...