UncleAndy
@UncleAndy

IPC::SysV — как определить заполненность очереди сообщений в shared memory?

Есть у меня задача, в которой передача информации между процессами организована через очереди в общей памяти с помощью команд msgsnd/msgrcv. Все отлично работает пока не возникает ситуации когда очередь переполняется и msgsnd не отрабатывает.


Мне нужно каким-то образом обнаруживать ситуацию переполнения очереди сообщений. Команда msgsnd возвращает false в неблокирующем режиме. По этому признаку мне нужно как-то определять что проблема именно в переполнении очереди, а не какая-то другая (например, что какой-то другой процесс не закрыл эту очередь). Вроде-бы это можно сделать с помощью функции msgctl и команды IPC_STAT. Но я не нашел в инете ни одного примера ее использования.


Может быть для моей задачи подойдут какие-то другие способы? Буду благодарен за ссылки или примеры.
  • Вопрос задан
  • 2681 просмотр
Пригласить эксперта
Ответы на вопрос 3
@ToSHiC
Проверяйте переменную $!, в неё перл запихивает errno. А дальше смотрите в man 2 msgsnd:
Значения errno, устанавливаемые при выполнении функции msgsnd:
EAGAIN
Сообщение не может быть помещено в очередь, потому что размер очереди превысит лимит, равный msg_qbytes , а в параметре mgsflg установлен флаг IPC_NOWAIT.
EACCES
Вызывающий процесс не имеет прав записи в очередь.
EFAULT
Память с адресом, указанным msgp, недоступна.
EIDRM
Очередь сообщений была удалена из системы.
EINTR
Процесс ждал свободного места в очереди и получил сигнал, который он должен обработать.
EINVAL
Задано неправильное значение msqid, неположительное значение mtype или неправильное значение msgsz (меньшее, чем 0, или большее, чем системный лимит, заданный MSGMAX).
ENOMEM
В системе недостаточно памяти для копирования содержимого буфера msgbuf.
Ответ написан
Комментировать
@edem
perl -d yourscript.pl
этот способ еще никогда не подводил. пройдись пошагово по всем проблемным строчкам в коде, да посмотри дампы нужных тебе переменных, должно помочь.
Ответ написан
Комментировать
UncleAndy
@UncleAndy Автор вопроса
Проблема не в том, что-бы определить проблему при отладке, а в том что-бы обрабатывать ситуацию runtime.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы