Почему msgrcv () вводит символы мусора в буфер? - PullRequest
0 голосов
/ 25 февраля 2020

прямо сейчас, я сейчас пытаюсь вывести содержимое buf.mtext, чтобы я мог убедиться в правильности ввода перед тем, как продолжить работу с моей программой. Кажется, все работает нормально, кроме одной вещи; msgrcv () помещает символы мусора в буфер, а процесс получателя выводит символы мусора.

Вот мой процесс отправителя:

int main (void)
{
   int  i;                 // loop counter
   int  status_01;         // result status
   int  msqid_01;          // message queue ID (#1)
   key_t msgkey_01;        // message-queue key (#1)

   unsigned int rand_num;
   float temp_rand;
   unsigned char eight_bit_num;

   unsigned char counter = 0;
   unsigned char even_counter = 0;
   unsigned char odd_counter = 0;

   srand(time(0));

   struct message {
        long mtype;
        char mtext[BUFFER_SIZE];
   } buf_01;

   msgkey_01 = MSG_key_01; // defined at top of file

   msqid_01 = msgget(msgkey_01, 0666 | IPC_CREAT)
   if ((msqid_01 <= -1) { exit(1); }

   /* wait for a key stroke at the keyboard ---- */
   eight_bit_num = getchar();

   buf_01.mtype = 1;

   /* send one eight-bit number, one at a time  ------------ */
   for (i = 0; i < NUM_REPEATS; i++)
   {
      temp_rand = ((float)rand()/(float)RAND_MAX)*255.0;
      rand_num = (int)temp_rand;
      eight_bit_num = (unsigned char)rand_num;

      if ((eight_bit_num % 2) == 0)
      {
         printf("Even number: %d\n", eight_bit_num);
         even_counter = even_counter + eight_bit_num;
      }
      else
      {
         printf("Odd number:       %d\n", eight_bit_num);
         odd_counter = odd_counter + eight_bit_num;
      }

      /* update the counters ------------------------------ */
      counter = counter + eight_bit_num;
      if((eight_bit_num % 2) == 0) { even_counter = even_counter + eight_bit_num; }
      else { odd_counter = odd_counter + eight_bit_num; }

      buf_01.mtext[0] = eight_bit_num;   // copy the 8-bit number
      buf_01.mtext[1] = '\0';            // null-terminate it

      status_01 = msgsnd(msqid_01, (struct msgbuf *)&buf_01, sizeof(buf_01.mtext), 0);
      status_01 = msgctl(msqid_01, IPC_RMID, NULL);
}

Вот мой процесс получателя:

int main() {

    struct message {
        long mtype;
        char mtext[BUFFER_SIZE];
    } buf;

    int msqid;

    key_t msgkey;

    msgkey = MSG_key_01;

    msqid = msgget(msgkey, 0666); // connect to message queue
    if (msqid < 0) {
        printf("Failed\n");
        exit(1);
    }
    else {
        printf("Connected\n");
    }

    if (msgrcv(msqid, &buf, BUFFER_SIZE, 0, 0) < 0) { // read message into buf
        perror("msgrcv");
        exit(1);
    }

    printf("Data received is: %s \n", buf.mtext);
    printf("Done receiving messages.\n");

    return 0;
}

Выходные данные обычно выглядят примерно так:

Data received is: ▒
Done receiving messages.

Я также очищал свои очереди сообщений каждый раз после запуска процессов отправителя и получателя, так как я пришел, чтобы найти это может вызвать проблемы. Заранее благодарим за помощь.

1 Ответ

0 голосов
/ 27 февраля 2020

Оказывается, ни одно из предложенных решений не было проблемой, как я подозревал; процесс отправителя на самом деле работает просто отлично. Проблема заключалась в том, что я пытался напечатать buf.mtext вместо buf.mtext [0], который не является действительным целочисленным значением. Я исправил проблему, просто сделав это:

int temp_num = buf.mtext[0];
printf("Data recieved is %d \n", temp_num);
...