Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Программирование под Unix/Linux > semget: Invalid argument


Автор: MastEdm 20.11.2008, 12:56
Добрый день.

При таком вызове:
Код

semget(key, 3, IPC_CREAT|0777);


получаю "semget: Invalid argument".  В чем тут может быть проблема и каким образом можно посмотреть число доступных на данный момент семафоров в системе (через терминал и через прогу)?

Спасибо.

Автор: GrayCardinal 20.11.2008, 13:15
MastEdm, 
Чему равен key ? С другим key пробовали ?

Автор: MastEdm 20.11.2008, 13:18
Ключ генерится так:
Код

    struct stat st;
    if (::stat(path, &st) < 0) { 
        return (key_t)-1;
    }
    return (key_t)((st.st_dev & 0x7f) << 24 | (st.st_ino & 0xffffff));

При падении, key был равен 16802421

Автор: MAKCim 20.11.2008, 13:28
MastEdm, 
попробуй через ftok() сгенерировать ключ

Автор: MastEdm 20.11.2008, 13:33
Да, он через ftok генерится, я просто не туда посмотрел. Это вообще либа, причем не моя.



Разобрался. Изначально ключ генерился по файлу. Пересобрал либу, чтобы генерилось по ftok. Все работает. Спасибо.

Автор: MastEdm 2.12.2008, 01:50
Рано радовался. Падает даже при использовании ftok

Код

/opt/data/ad.in 1459730003
semget: Invalid argument
...
/opt/data/stat.in 1459730189
semget: Invalid argument


Тот же вопрос: в чем бага?


Автор: MAKCim 2.12.2008, 11:26
Цитата(MastEdm @  2.12.2008,  01:50 Найти цитируемый пост)
Тот же вопрос: в чем бага?

Цитата(man 2 semget)

EINVAL     nsems  is  less  than 0 or greater than the limit on the number of semaphores per semaphore set (SEMMSL), or a
                  semaphore set corresponding to key already exists, and nsems is larger than the number of semaphores  in  that
                  set.

Автор: MastEdm 2.12.2008, 13:48
Читать маны я умею, но все равно спасибо за ответ.

Немного пожить позволило использование IPC_PRIVATE вместо ключа в semget, правда потом все равно получил 
Код

semget: No space left on device


Ну а дальше с помощью ipcs -s и ipcrm -s кильнул лишние и все заработало. 

Возник следующий вопрос: как эффективно чистить семафоры?

Автор: MAKCim 2.12.2008, 14:41
Цитата(MastEdm @  2.12.2008,  13:48 Найти цитируемый пост)
Возник следующий вопрос: как эффективно чистить семафоры?

а semctl с IPC_RMID не помогает?

 smile 
я бы не советовал использовать SVR5 IPC (разве что только речь не идет о сверх переносимости)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)