Почему я не могу получить доступ к тексту сообщения в моей очереди сообщений с помощью msgrcv ()? - PullRequest
0 голосов
/ 19 ноября 2018

У меня есть программа, которая позволяет мне создавать и удалять очереди сообщений, а также отправлять и получать сообщения.

Кажется, все работает правильно, за исключением получения сообщений. Когда я получаю структуру, я могу получить доступ к типу (который я использовал для обозначения «получателя») и распечатать его, однако строка, сохраненная в поле msg структуры, не будет напечатана. Кажется, что printf () успешно обращается к полю mbuf.type, но не к mbuf.msg после использования msgrcv (). Я попытался отладить, чтобы выяснить, в чем проблема, но до сих пор не удалось.

Похоже, что сообщение отправлено в очередь, так как когда я использую «ipcs -q» для просмотра очередей сообщений моего ядра, оно будет правильно отображать количество отправленных сообщений. Я также могу получить доступ и напечатать поле msg в том экземпляре программы, в которую я отправляю сообщение. Только после того, как программа выйдет и я перезапущу ее, используя флаг "-r", я не смогу распечатать поле msg.

Я включил приведенный ниже код, включая заголовочный файл, содержащий определение моей структуры сообщения.

Обратите внимание: я понимаю, что моя проверка неуклюжа, и я планирую упростить ее, как только программа будет работать правильно. Я прошу прощения, если это сбивает с толку.

ФАЙЛ ГОЛОВКИ:

#ifndef MESSAGE_BUFFER
#define MESSAGE_BUFFER

#define MSG_MAX 4056

typedef struct messageBuffer
{
    long recipient; //recipient of message
    long senderID; //id number of the sender    
    char msg[MSG_MAX]; //content of the message
}messageBuffer;

#endif

MAIN:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <sys/types.h>
#include "message.h"


//function to print usage information upon error
void printUsage(){
    printf("Error: Invalid arguments\n"); 
    printf("Usage:\n");
    printf("(Create Queue) <-c/C> <key>\n");
    printf("(Send a message) <-s/S> <key> <recipient_id> <message>\n"); 
    printf("(Receive a message) <-r/R> <key> <recipient_id>\n");        printf("(Delete queue) <-d/D> <key>\n");
}


//main
int main(int argc, char **argv){

//declare necessary variables
char flag;
int msqid;
messageBuffer mbuf;
size_t buf_length;
int msgflg = IPC_CREAT | 0666;
key_t key;
unsigned long recipient;



//validate arguments
if((argc < 3 || argc > 5) || argv[1][0] != '-' || strlen(argv[1]) != 2){    
    printf("%d\n", argc);   
    printUsage();
    return -1;  
}

flag = argv[1][1];


switch(flag){

        //Create a message queue
    case 'c':
    case 'C':
        if((key = atoi(argv[2])) < 1){
            printf("Error assigning key");
            return -1;
        }
        if((msqid = msgget(key, msgflg)) < 1){
            printf("Error creating queue:");
            return -1;
        }
        printf("%s%i\n", "Key: ", key);
        printf("%s%i\n", "msqid: ", msqid);
        break;

        //Send a message
    case 's':
    case 'S':
        if((key = atoi(argv[2])) < 1){
            perror("Error assigning key:");
            return -1;
        }
        if((msqid = msgget(key, 0400)) < 1){
            perror("Error accessing queue:");
        }
        mbuf.recipient = atoi(argv[3]);
        strncpy(mbuf.msg, argv[4], MSG_MAX);
        buf_length = strlen(mbuf.msg) + 1;
        if(msgsnd(msqid, &mbuf, buf_length, 0) < 0){
            perror("Error sending message:");
            return -1;
        }   
        printf("Message sent (%lu): %s\n", mbuf.recipient, mbuf.msg);

        break;

        //Receive a message
    case 'r':
    case 'R':
        if((key = atoi(argv[2])) < 1){
            perror("Error assigning key:");
            return -1;
        }
        if((msqid = msgget(key, 0400)) < 1){
            perror("Error accessing queue:");
        }
        recipient = atoi(argv[3]);
        if( msgrcv(msqid, &mbuf, MSG_MAX, recipient, 0)< 0){
            perror("Error receiving message:");
            return -1;
        }
        printf("Message received (%lu):\n", mbuf.recipient);
        printf("%s\n", mbuf.msg);
        break;

        //Delete a message queue
    case 'd':
    case 'D':
        if((key = atoi(argv[2])) < 1){
            perror("Error assigning key");
            return -1;
        }
        if((msqid = msgget(key, 0400)) < 1){
            perror("Error accessing queue:");
        }


        printf("%d\n", msqid);
        if((msgctl(msqid, IPC_RMID, NULL)) < 0){
            perror("Delete message queue failed:");
        }
        break;  

        //invalid flag
    default:
        printUsage();
        return -1;      
}






return 0;
}

Буду признателен за любой вклад. Спасибо.

1 Ответ

0 голосов
/ 20 ноября 2018

Оказывается, проблема заключалась в указании размера передаваемой структуры. Я изменил код "buf_length = strlen (mbuf.msg) + 1;" в buf_length = (sizeof (mbuf.msg) + 1);

...