Очередь сообщений: ошибка msgsnd: неверный аргумент - PullRequest
2 голосов
/ 07 марта 2011

Может ли кто-нибудь помочь мне указать, что является ошибкой в ​​моей программе?

Заранее спасибо, kingsmasher1

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <string.h>
#include <errno.h>

typedef struct msgbuf {
    long mtype;     /* message type, must be > 0 */
    char mtext[15];  /* message data */
} msgbuf;

int main() {
    key_t key;
    int msqid, pid, length;
    msgbuf buf;

    msqid=msgget(IPC_PRIVATE,IPC_CREAT);

    if(msqid==-1){
        perror("msgget failed");
        return;
    }
    else {
        printf("msgget succeeded. ID:%u",msqid);
    }

    pid=fork();

    if(pid==-1) {
        perror("fork failed\n");
    }

    buf.mtype=1;
    strcpy(buf.mtext, "This is a test message");
    length=sizeof(buf.mtext);

    if(msgsnd(msqid,&buf,length,0)!=0) {
        perror("msgsnd failed:\n");
    }
    else {
       printf("msgsnd succeeded\n");
    }
}

Вывод: ошибка msgsnd: неверный аргумент

1 Ответ

8 голосов
/ 07 марта 2011

В вашем buf.mtext (15 символов) недостаточно места для "This is a test message" (23 символа добавляют еще один для терминатора NUL).

Я бы сказал, что есть хороший шанс, который можетповредить ваш тип или даже некоторую другую информацию в стеке (например, msqid или length или key).

Является ли это реальной проблемой или нет, этовсе еще неопределенное поведение и должно быть исправлено.Первое, что я хотел бы сделать, это проверить, заменив:

strcpy(buf.mtext, "This is a test message");

на:

strcpy(buf.mtext, "XYZZY");  // 5 plus the NUL

, чтобы посмотреть, исправит ли это.* достаточно большой, чтобы хранить данные, которые вы помещаете туда.

...