首页 > 解决方案 > Problem with receiving numbers from message queues

问题描述

Main task: Write three programs. Let the first program write even numbers to the queue, the second program write odd numbers, and let the third program read consecutive pairs of numbers from the queue and sum them up together.

The problem is that after the first two programs send numbers, the third receives only the first numbers, and the rest do not and resuls zero.

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

Result:

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

标签: clinuxubuntumessage-queue

解决方案


推荐阅读