IO作业7.0
2024-01-09 22:29:19
思维导图
使用消息队列完成两个进程之间相互通信
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <myhead.h>
//定义结构体
struct msgbuf
{
long mtybe; //消息类型
char mtext[1024]; //消息正文
};
//定义一个宏,表示正文大小
#define SIZE (sizeof(struct msgbuf) - sizeof(long))
int main(int argc, const char *argv[])
{
//定义进程号
pid_t pid;
//1、创建key值
key_t key = 0;
if((key = ftok("/",'t')) == -1)
{
perror("fork error");
return -1;
}
//2、使用key创建一个消息队列
int msqid = 0;
if((msqid = msgget(key,IPC_CREAT|0664)) == -1)
{
perror("msgget error");
return -1;
}
pid=fork();
if(pid>0){
//定义一个消息类型的容器
struct msgbuf buf = {.mtybe=2};
//3、循环向队列中存放数据
while(1)
{
printf("请输入存放的数据:");
scanf("%s",buf.mtext);
getchar(); //吸收回车
//将消息存放到消息队列中
msgsnd(msqid,&buf,SIZE,0);
printf("发送成功\n");
if(strcmp(buf.mtext,"quit") == 0)
{
break;
}
}
}
else if(pid == 0)
{
//定义一个消息类型的容器
struct msgbuf buf={.mtybe=1};
//3、循环向队列中存放数据
while(1)
{
//从消息队列中读取消息
msgrcv(msqid,&buf,SIZE,1,0);
//第一个0表示无视类型,每次都取第一个消息
//第二个0表示阻塞形式接受消息
printf("收到的消息为:%s\n",buf.mtext);
if(strcmp(buf.mtext,"quit") == 0)
{
break;
}
}
exit(EXIT_SUCCESS);
}
else
{
perror("fork error");
return -1;
}
wait(NULL);
return 0;
}
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <myhead.h>
//定义结构体
struct msgbuf
{
long mtybe; //消息类型
char mtext[1024]; //消息正文
};
//定义一个宏,表示正文大小
#define SIZE (sizeof(struct msgbuf) - sizeof(long))
int main(int argc, const char *argv[])
{
//定义进程号
pid_t pid;
//1、创建key值
key_t key = 0;
if((key = ftok("/",'t')) == -1)
{
perror("fork error");
return -1;
}
//2、使用key创建一个消息队列
int msqid = 0;
if((msqid = msgget(key,IPC_CREAT|0664)) == -1)
{
perror("msgget error");
return -1;
}
pid=fork();
if(pid>0){
//定义一个消息类型的容器
struct msgbuf buf={.mtybe=2};
//3、循环向队列中存放数据
while(1)
{
//从消息队列中读取消息
msgrcv(msqid,&buf,SIZE,2,0);
//第一个0表示无视类型,每次都取第一个消息
//第二个0表示阻塞形式接受消息
printf("收到的消息为:%s\n",buf.mtext);
if(strcmp(buf.mtext,"quit") == 0)
{
break;
}
}
}
else if(pid == 0)
{
//定义一个消息类型的容器
struct msgbuf buf = {.mtybe=1};
//3、循环向队列中存放数据
while(1)
{
printf("请输入存放的数据:");
scanf("%s",buf.mtext);
getchar(); //吸收回车
//将消息存放到消息队列中
msgsnd(msqid,&buf,SIZE,0);
printf("发送成功\n");
if(strcmp(buf.mtext,"quit") == 0)
{
break;
}
}
exit(EXIT_SUCCESS);
}
else
{
perror("fork error");
return -1;
}
wait(NULL);
//4、删除消息队列
if(msgctl(msqid,IPC_RMID,NULL)==-1)
{
perror("msgctl error");
return -1;
}
return 0;
}
文章来源:https://blog.csdn.net/mmj12/article/details/135490653
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!