c - 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
解决方案
推荐阅读
- python - 如何创建一个列表,然后按升序打印
- react-native - 在 React Native 中登录成功时如何导航仪表板?
- android - TextView 监控值
- python - 如何从 Python 中的 N(80, σ=15) 分布生成 200 个大小为 10 的随机子组
- html - Mathjax - \eqref 命令切断方程的顶部
- java - Java Hibernate Search Like Query - 注入保护 - 参数绑定?
- python - curl json 与 python 到 php
- r - 如何在 R 中输出汉字(汉字/汉字/汉字)?
- python - 深度优先搜索 8 益智游戏“从空列表中弹出”
- html - 如何使用谷歌地图 API 沿着折线获取 POI