2024.8.6 作业

server/2024/9/23 9:25:40/

1> 使用消息队列完成两个进程之间相互通信

snd.c

#include <myhead.h>struct msgbuf
{long mtype;char mtext[1024];
};#define SIZE sizeof(struct msgbuf)-sizeof(long)int main(int argc,const char *argv[])
{pid_t pid = fork();if(pid==-1){perror("fork error");return -1;}		else if(pid==0){//子进程key_t key = ftok("/",'k');int msqid = msgget(key,IPC_CREAT|0644);if(msqid==-1){perror("msgget error");return -1;}struct msgbuf buf;while(1)                  //接受类型2消息{msgrcv(msqid,&buf,SIZE,2,0);if(strcmp(buf.mtext,"quit")==0){break;}printf("收到消息:%s\n",buf.mtext);}exit(EXIT_SUCCESS);}//父进程key_t key = ftok("/",'k');int msqid = msgget(key,IPC_CREAT|0644);if(msqid==-1){perror("msgget error");return -1;}struct msgbuf buf;while(1)               //发送类型1消息{fgets(buf.mtext,SIZE,stdin);buf.mtext[strlen(buf.mtext)-1]=0;buf.mtype=1;msgsnd(msqid,&buf,SIZE,0);if(strcmp(buf.mtext,"quit")==0){break;}}wait(NULL);return 0;
}

recv.c

#include <myhead.h>struct msgbuf
{long mtype;char mtext[1024];
};#define SIZE sizeof(struct msgbuf)-sizeof(long)int main(int argc,const char *argv[])
{pid_t pid = fork();if(pid==-1){perror("fork error");return -1;}		else if(pid==0){//子进程key_t key = ftok("/",'k');int msqid = msgget(key,IPC_CREAT|0644);if(msqid==-1){perror("msgget error");return -1;}struct msgbuf buf;while(1)                   //发送类型2消息{fgets(buf.mtext,SIZE,stdin);buf.mtext[strlen(buf.mtext)-1]=0;buf.mtype=2;msgsnd(msqid,&buf,SIZE,0);if(strcmp(buf.mtext,"quit")==0){break;}}exit(EXIT_SUCCESS);}key_t key = ftok("/",'k');int msqid = msgget(key,IPC_CREAT|0644);if(msqid==-1){perror("msgget error");return -1;}struct msgbuf buf;while(1)                         //接受类型1消息{msgrcv(msqid,&buf,SIZE,1,0);if(strcmp(buf.mtext,"quit")==0){break;}printf("收到消息:%s\n",buf.mtext);}wait(NULL);if(msgctl(msqid,IPC_RMID,NULL)==-1){perror("msgctl error");return -1;}return 0;
}

2> 将共享内存的实现重新敲一遍

snd.c

#include<myhead.h>
#include<sys/user.h>int main(int argc, const char *argv[])
{//1、创建key值用于创建共享内存段key_t key = ftok("/", 't');if(key == -1){perror("ftok error");return -1;}printf("key = %d\n", key);//2、创建一个共享内存的对象int shmid = shmget(key, PAGE_SIZE, IPC_CREAT|0664);if(shmid == -1){perror("shmget error");return -1;}printf("shmid = %d\n", shmid);//3、将共享内存段映射到程序中来char *addr = (char *)shmat(shmid, NULL, 0);printf("addr = %p\n", addr);         //输出映射的地址//向共享内存中写入数据strcpy(addr, "hello a hua qing yuan jian\n");sleep(5);//取消映射关系if(shmdt(addr) ==-1){perror("shmdt error");return -1;}while(1);return 0;
}

recv.c

#include<myhead.h>
#include<sys/user.h>int main(int argc, const char *argv[])
{//1、创建key值用于创建共享内存段key_t key = ftok("/", 't');if(key == -1){perror("ftok error");return -1;}printf("key = %d\n", key);//2、创建一个共享内存的对象int shmid = shmget(key, PAGE_SIZE, IPC_CREAT|0664);if(shmid == -1){perror("shmget error");return -1;}printf("shmid = %d\n", shmid);//3、将共享内存段映射到程序中来char *addr = (char *)shmat(shmid, NULL, 0);printf("addr = %p\n", addr);         //输出映射的地址//读出共享内存中的数据printf("消息为:%s", addr);sleep(5);if(shmdt(addr) == -1){perror("shmdt error");return -1;}//删除共享内存if(shmctl(shmid, IPC_RMID, NULL) == -1){perror("shmctl error");return -1;}while(1);return 0;
}

 思维导图


http://www.ppmy.cn/server/96271.html

相关文章

DataEase安装和部署(超细教程)

概述: DataEase 是开源的数据可视化分析工具,帮助用户快速分析数据并洞察业务趋势,从而实现业务的改进与优化。DataEase 支持丰富的数据源连接,能够通过拖拉拽方式快速制作图表,并可以方便的与他人分享。 DataEase 的优势: 开源开放:零门槛,线上快速获取和安装,按月…

rsync远程同步+inotify监控

一、概述 1、关于rsync rsync远程同步&#xff1a;是开源的快速备份工具&#xff0c;可以在不同主机之间同步整个目录 在远程同步任务中&#xff0c;负责发起rsync同步操作的客户机称为发起端&#xff08;服务端&#xff09;&#xff0c;而负责响应来自客户机的rsync同步操作…

电脑自动重启是什么原因?重启原因排查和解决办法!

当你的电脑突然毫无预警地自动重启&#xff0c;不仅打断了工作流程&#xff0c;还可能导致未保存的数据丢失&#xff0c;这无疑令人很懊恼&#xff0c;那么&#xff0c;电脑自动重启是什么原因呢&#xff1f;有什么方法可以解决呢&#xff1f;别担心&#xff0c;在大多数情况下…

MATLAB(7)潮汐模型

一、前言 在MATLAB中模拟潮汐通常涉及到使用潮汐的理论模型&#xff0c;如调和常数模型&#xff08;Harmonic Constants Model&#xff09;&#xff0c;它基于多个正弦和余弦函数的叠加来近似潮汐高度随时间的变化。以下是一个简化的MATLAB代码示例&#xff0c;用于模拟一个基于…

C++笔记之编译过程和面向对象

回顾&#xff1a; “abcd”//数据类型 字符串常量 const char *p"abc"; new STU const char *//8 指针的内存空间 int float 指针的内存空间 p 指针指向的内存空间 "abc" 取决于字符串长度 指针变量的内容一级指针 指针变量的地址二级指针 …

LearnOpenGL之摄像机

前序 AndroidLearnOpenGL是本博主自己实现的LearnOpenGL练习集合&#xff1a; Github地址&#xff1a;https://github.com/wangyongyao1989/AndroidLearnOpenGL 系列文章&#xff1a; 1、LearnOpenGL之入门基础 2、LearnOpenGL之3D显示 3、LearnOpenGL之摄像机 4、LearnOpenG…

RabbitMq架构原理剖析及应用

文章目录 RabbitMQ 架构组件1. **Broker** (Broker Server)2. **Exchange**3. **Queue**4. **Producer** (消息生产者)5. **Consumer** (消息消费者)6. **Virtual Hosts** (虚拟主机) 工作流程内部原理1. **队列管理**2. **集群**3. **持久化与内存**4. **性能优化** 高级特性1…

Pytest测试报告生成专题

在 pytest 中&#xff0c;你可以使用多个选项生成不同格式的测试报告。以下是几种常用的生成测试报告的方法&#xff1a; 1. 生成简单的测试结果文件 你可以使用 pytest 的 --junitxml 选项生成一个 XML 格式的测试报告&#xff0c;这个报告可以与 CI/CD 工具集成。 pytest …