C 从消息队列接收号码时出现问题
主要任务:编写三个程序。让第一个程序将偶数写入队列,第二个程序将奇数写入队列,让第三个程序从队列中读取连续的数对并将它们相加 问题是,在前两个程序发送数字后,第三个程序只接收第一个数字,其余程序不接收,结果为零C 从消息队列接收号码时出现问题,c,linux,ubuntu,message-queue,C,Linux,Ubuntu,Message Queue,主要任务:编写三个程序。让第一个程序将偶数写入队列,第二个程序将奇数写入队列,让第三个程序从队列中读取连续的数对并将它们相加 问题是,在前两个程序发送数字后,第三个程序只接收第一个数字,其余程序不接收,结果为零 //first prog sender even number #include<stdio.h> #include<string.h> #include<sys/ipc.h> #include<sys/msg.h> #include&l
//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;
}
如果真正发送的是一个
int
值,为什么要为mtext
设置一个50
整数数组?实际上,我认为这个数组是问题的根源之一。如果将程序修改为仅对整数值使用mtext[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;
}