2016-10-14 5 views
1

Я пишу программу, используя очереди сообщений unix. Проблема в том, что программа сообщает мне «Ошибка: 22: недопустимые аргументы». Я сделал это, но это не удовлетворяет моему поиску. Вот простой код:Linux ipc msgsnd() failed

bool msg::send(int key, void* data) 
{ 
    (void) data; 
    bool res = false; 
    m_msgId = msgget(key, m_mask); 
    if (m_msgId == -1) { 
     // noone create it 
     if ((m_msgId = msgget(key, m_mask | IPC_CREAT)) == -1) { 
      fprintf(stderr, "Error creating message: %d:(%s)\n", 
              errno, 
              strerror(errno)); 
      return res; 
     } 
    } 

    union { 
     msg m; 
     char c[sizeof(msg)]; 
    } u = {*this}; // it`s a deep copy 

    // here the program fails // 
    int ret = msgsnd(m_msgId, u.c, 
        sizeof(msg), IPC_NOWAIT); 
    if (ret == -1) { 
     if (errno != EAGAIN) { 
      // here is errno 22 // 
      fprintf(stderr, "Error creating message: %d:(%s)\n", 
              errno, 
              strerror(errno)); 

      return res; 

     } else { 
      if (msgsnd(m_msgId, u.c, 
         sizeof(msg), 0) == -1) { 
       fprintf(stderr, "Error creating message: %d:(%s)\n", 
               errno, 
               strerror(errno)); 
       res = false; 
      } 
     } 
    } 
    res = true; 
    return res; 
} 

Если я пытаюсь отправить обычную строку типа «1234567», это нормально. Но отправка этого буфера не выполняется. Что я делаю неправильно? Спасибо.

+0

msgsnd может потерпеть неудачу размер> MSG_MAX – pm100

+0

мой размер 20 байт. –

ответ

2

Одно условие EINVAL для msgsnd таково, что "the value of mtype is less than 1".

msgsnd ожидает, что буфер передачи является длиной описания типа сообщения (метатип), а затем само сообщение. Вы ошибочно не устанавливаете тип сообщения, и поэтому msgsnd будет интерпретировать первый длинный-длина байта вашего сообщения как mtype. Это происходит, когда сообщение "1234567", но с ошибкой *this.

Вы хотите определить что-то вроде этого:

struct mymsg { 
    long mtype; 
    char mtext[SUFFICIENTLY_LARGE]; 
}; 

и скопировать сообщение в памяти Mtext пока явно устанавливая MTYPE> = 1.

+0

Спасибо, какой трюк. Так оно и было. –