Проверяйте переменную $!, в неё перл запихивает 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.