2016-10-14 6 views
1

Ich schreibe ein Programm mit Unix-Nachrichtenwarteschlangen. Das Problem ist das, das Programm meldet mir "Fehler: 22: ungültige Argumente". Ich habe gepumpt, aber es befriedigt meine Suche nicht. Hier ist der einfache Code:Linux ipc msgsnd() schlägt fehl

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; 
} 

Wenn ich versuche, eine normale Zeichenfolge wie "1234567" zu senden, ist es in Ordnung. Aber dieses Senden des Puffers schlägt fehl. Was mache ich falsch? Danke.

+0

msgsnd fehlschlagen kann, ist Größe> MSG_MAX – pm100

+0

meine Größe ist 20 Bytes. –

Antwort

2

Eine EINVAL Bedingung für msgsnd ist, dass "the value of mtype is less than 1".

msgsnd erwartet, dass der Sendepuffer ein langen beschreibt Nachrichtentyp (mtype) gefolgt von der Nachricht selbst. Sie legen den Nachrichtentyp fälschlicherweise nicht fest, und daher interpretiert msgsnd die ersten langen -langen Bytes Ihrer Nachricht als mtype. Dies funktioniert, wenn die Nachricht "1234567" ist, schlägt aber mit *this fehl.

Sie wollen etwas definieren:

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

und kopieren Sie Ihre Nachricht in mtext auf den Speicher während explizit mtype Einstellung> = 1.

+0

Danke, was für ein Trick. Das hat es getan. –