Проблема с получением номеров из очередей сообщений - PullRequest
0 голосов
/ 02 ноября 2019

Основная задача: написать три программы. Пусть первая программа записывает четные числа в очередь, вторая программа записывает нечетные числа, а третья программа считывает последовательные пары чисел из очереди и суммирует их вместе.

Проблема заключается в том, что после первогодве программы отправляют числа, третья получает только первые числа, а остальные - нет, и результат равен нулю.

//first prog sender even number

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

#define TEXT_LENGTH 50

 struct msgbuf {
 long type;
 int mtext[TEXT_LENGTH];
 };

 void send_message(int mqid)
 {
 struct msgbuf buffer;
  memset(buffer.mtext,0,sizeof(buffer.mtext));

int message =2;
for(int i =0;i<8;i++){
 buffer.type = 1;
 buffer.mtext[i]=message;

 if(msgsnd(mqid,&buffer,sizeof(buffer.mtext[i]),0)<0)
 perror("msgsnd");
 printf("Program send even number : %d\n",message);
 message+=2;
}
 }

 int main(void)
 {
 int key = ftok("io",8);
 if(key<0)
 perror("ftok");

 int id = msgget(key,0600);
 if(id<0)
 perror("msgget");

 send_message(id);

 return 0;
 }
//second program sender odd number
#include<stdio.h>
#include<string.h>
#include<sys/ipc.h>
#include<sys/msg.h>
#include<sys/types.h>

#define TEXT_LENGTH 50

 struct msgbuf {
 long type;
 int mtext[TEXT_LENGTH];
 };

 void send_message(int mqid)
 {
 struct msgbuf buffer2;
 memset(buffer2.mtext,0,sizeof(buffer2.mtext));
int message=-1;
 buffer2.type = 2;
 for(int i =0;i<8;i++){
         message+=2;
 buffer2.mtext[i]=message;

 if(msgsnd(mqid,&buffer2,sizeof(buffer2.mtext[2]),0)<0)
 perror("msgsnd");
 printf("Program send odd number : %d\n",message);

 }
 }

 int main(void)
 {
 int key = ftok("io",8);
 if(key<0)
 perror("ftok");

 int id = msgget(key,0600);
 if(id<0)
 perror("msgget");

 send_message(id);

 return 0;
 }
//third program recipient

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

 struct msgbuf {
 long type;
 int mtext[50];
 };

 void receive_message(int mqid)
 {
 struct msgbuf buffer;
 struct msgbuf buffer2;

for(int i =0;i<8;i++){
 if(msgrcv(mqid,&buffer,sizeof(buffer.mtext[i]),1,0)<0)
 perror("msgrcv");
 else
 printf("\nEven number : %d\n",buffer.mtext[i]);

if(msgrcv(mqid,&buffer2,sizeof(buffer2.mtext[i]),2,0)<0)
 perror("msgrcv");
 else
 printf("Odd number : %d\n",buffer2.mtext[i]);
printf("Sum :%d",buffer.mtext[i] + buffer2.mtext[i]);
 }
 }
 int main(void)
 {
 int key = ftok("io",8);
 if(key<0)
 perror("ftok");
 int id = msgget(key,0600|IPC_CREAT|IPC_EXCL);
 if(id<0)
 perror("msgget");
 receive_message(id);
 if(msgctl(id,IPC_RMID,0)<0)
 perror("msgctl");
 return 0;
 }

Результат:

Even number : 2
Odd number : 1
Sum :3
Even number : 0
Odd number : 0
Sum :0
Even number : 0
Odd number : 0
Sum :0
Even number : 0
Odd number : 0
Sum :0
Even number : 0
Odd number : 0
Sum :0
Even number : 0
Odd number : 0
Sum :0
Even number : 0
Odd number : 0
Sum :0
Even number : 0
Odd number : 0
Sum :0
...