Основная задача: написать три программы. Пусть первая программа записывает четные числа в очередь, вторая программа записывает нечетные числа, а третья программа считывает последовательные пары чисел из очереди и суммирует их вместе.
Проблема заключается в том, что после первогодве программы отправляют числа, третья получает только первые числа, а остальные - нет, и результат равен нулю.
//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