【0807作业】使用消息队列实现AB进程对话+使用共享内存实现A进程打印字符串,B进程逆置字符串,打印结果为【正序 逆序 正序 逆序】

news2024/11/27 6:19:39

作业一:使用消息队列实现AB进程对话

① 打开两个终端,要求实现AB进程对话

  1. A进程先发送一句话给B进程,B进程接收后打印
  2. B进程再回复一句话给A进程,A进程接收后打印
  3. 重复1.2步骤,当收到quit后,要结束AB进程

② 实现随时收发:用多进程 多线程。

1)A终端

#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <fcntl.h>
#include <unistd.h>
#include <signal.h>
/***************************A终端***************************/
struct msgbuf
{
    long mtype;      //消息类型,必须大于0
    char mtext[128]; //消息内容
};
int main(int argc, const char *argv[])
{
    //创建key值
    key_t key = ftok("/home/ubuntu",1);
    if(key < 0)
    {
        perror("mkfifo");
        return -1;
    }
    //创建消息队列
    int msqid = msgget(key, IPC_CREAT|0664) ;
    if(msqid< 0)
    {
        perror("mkfifo");
        return -1;
    }                                                                           

    struct msgbuf Abuf;
    ssize_t res=0;
    //创建子进程
    pid_t cpid=fork();
    if(cpid > 0)  //父进程(发送),A终端发送消息,B终端接收消息
    {
        while(1)
        {
            Abuf.mtype=1;
            scanf("%s",Abuf.mtext);
            if(msgsnd(msqid, &Abuf,sizeof(Abuf.mtype),0) < 0)
            {
                perror("msgsnd");
                return -1;
            }
            if(strcmp(Abuf.mtext,"quit")==0)
                break;
        }
    }
    else if(0 == cpid) //子进程(接收),B终端发送消息,A终端接收
    {
        while(1)
        {
            msgrcv(msqid,&Abuf,sizeof(Abuf.mtext),2,0);
            if(res < 0)
            {
                perror("msgrcv");
                return -1;
            }
            if(strcmp(Abuf.mtext,"quit")==0)
                break;
            printf("%s\n",Abuf.mtext);
        }
        kill(getppid(),2);
    }
    else
    {
        perror("fork");
        return -1;
    }
    return 0;
}

2)B终端

#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <fcntl.h>
#include <unistd.h>
#include <signal.h>
/***************************B终端***************************/
struct msgbuf
{
    long mtype;      //消息类型,必须大于0
    char mtext[128]; //消息内容
};
int main(int argc, const char *argv[])
{
    //创建key值
    key_t key = ftok("/home/ubuntu",1);
    if(key < 0)
    {
        perror("mkfifo");
        return -1;
    }
    //printf("key = %#x\n",key);
    //创建消息队列
    int msqid = msgget(key, IPC_CREAT|0664) ;
    if(msqid< 0)
    {
        perror("mkfifo");
        return -1;
    }

    struct msgbuf Bbuf;
    ssize_t res=0;
    pid_t cpid=fork();
    if(cpid > 0)   //父进程(接收),A终端发送消息,B终端接收消息
    {   
        while(1)
        {
            Bbuf.mtype=2;
            scanf("%s",Bbuf.mtext);
            if(msgsnd(msqid, &Bbuf,sizeof(Bbuf.mtype),0) < 0)
            {
                perror("msgsnd");
                return -1;
            }
            if(strcmp(Bbuf.mtext,"quit")==0)
                break;
        }

    }
    else if(0 == cpid)  //子进程(发送),B终端发送消息,A终端接收
    {   
        while(1)
        {
            msgrcv(msqid,&Bbuf,sizeof(Bbuf.mtext),1,0);
            if(res < 0)
            {
                perror("msgrcv");
                return -1;
            }
            if(strcmp(Bbuf.mtext,"quit")==0)
                break;
            printf("%s\n",Bbuf.mtext);
        }
        kill(getppid(),2);
    }
    else
    {
        perror("fork");
        return -1;
    }
    return 0;
}

3)结果

作业二:使用共享内存实现A进程打印字符串,B进程逆置字符串,打印结果为【正序 逆序 正序 逆序】

打开两个终端,要求实现:

  1. 在共享内存中存入字符串 “1234567”
  2. A进程循环打印字符串,B进程循环倒置字符串,要求结果不允许出现乱序
  • 提示:共享内存中存储 flag + string.

1)程序

#include <stdio.h>
#include <string.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/types.h>
#include <unistd.h>
int main(int argc, const char *argv[])
{
    //创建key值
    key_t key = ftok("./",10);
    if(key < 0)
    {
        perror("ftok");
        return -1;
    }
    printf("key = %#x\n",key);

    //创建共享内存,获得shmid号
    int shmid = shmget(key,32,IPC_CREAT|0664);
    if(shmid < 0)
    {
        perror("shmget");
        return -1;
    }
    printf("shmid = %d\n",shmid);

    //映射共享内存到用户空间
    void* addr= shmat(shmid,NULL,0);
    if((void*)-1 == addr)
    {
        perror("shmat");
        return -1;
    }
    printf("addp = %p",addr);

    *(int*)addr=0;
    //strcat((char*)addr+4,"1234567");
    char *ptr=(char*)addr+4;
    strcpy(ptr,"1234567");
    pid_t cpid = fork();
    if(cpid > 0)  //父进程:打印
    {
        while(1)
        {
            if(0 == *(int*)addr)
            {
                printf("%s\n",(char*)addr+4);
                *(int*)addr=1;
            }
        }
    }
    else if(0 == cpid)  //子进程:逆置
    {
        char t;
        while(1)
        {
            if(1 == *(int*)addr)
            {
                char *p=(char*)addr+4;
                char *q=(char*)addr+4+strlen(ptr)-1;
                while(p<q)
                {
                    t=*p;
                    *p=*q;
                    *q=t;
                    p++;
                    q--;
                }
                *(int*)addr=0;
            }
        }
    }
    else
    {                                                        
        perror("fork");
        return -1;
    }
    return 0;
}
                                                            

2)结果

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/844347.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

HCIA---OSI/RM--开放式系统互联参考模型

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 目录 一.OSI--开放式系统互联参考模型简介 1.OSI七层参考模型&#xff1a; HTTP请求工作过程&#xff1a; 二.OSI参考模型详解 链路层&#xff1a; 网络层&#…

【Java+springboot】基于物联网技术的粮油质量管控防伪溯源管理系统源码

基于物联网技术、RFID技术和RSA、PGP加密算法开发的粮油质量管控防伪追溯系统 一、概述 粮油安全关系千千万万消费者的健康问题。近年来&#xff0c;许多食品行业安全事故频频涌现&#xff0c;成为社会关注焦点。粮油生产加工质量管控防伪溯源系统为粮油提供从种植、生产、加工…

Godot 4 源码分析 - 文件读入编码处理

今天需要读入xml文件进行处理&#xff0c;结果读入一个带中文的文件时&#xff0c;出错了。当然程序还能运行&#xff0c;但编译器一直报错&#xff0c;而且XML解析也不正确 单步调试发现读入的内容出现乱码&#xff0c;具体逻辑&#xff1a; String FileAccess::get_as_text…

CAPL - XML和TestModule结合实现测试项可选

目录 目的:是否想实现如下面的功能呢? 一、.can和.cin文件中函数开发

Git工具安装

Git 工具安装 1. 下载Git安装包2. 安装Git工具3. 简单的使用配置用户名 1. 下载Git安装包 打开官网 https://git-scm.com/downloads点击下载 2. 安装Git工具 右击以管理员身份运行 ![在这里插入图片描述](https://img-blog.csdnimg.cn/9a99a73d54824800bc87db64f71f7602.png…

Selenium自动化测试总结

一、Selenium自动化测试&#xff08;基于python&#xff09; 1、Selenium简介&#xff1a; 1.1 Selenium是一款主要用于Web应用程序自动化测试的工具集合。Selenium测试直接运行在浏览器中&#xff0c;本质是通过驱动浏览器&#xff0c;模拟浏览器的操作&#xff0c;比如跳转、…

6.4.3 1x1卷积层

特点&#xff1a;1x1卷积层相当于全连接层 作用&#xff1a;1x1卷积用于调整网络层的通道数量和控制模型复杂度 输入形状&#xff1a;(通道&#xff0c;行&#xff0c;列) (3,3,3) 卷积核形状&#xff1a;(输出通道&#xff0c;输入通道&#xff0c;行&#xff0c;列) (2,3,…

SAP ABAP程序性能优化-养成良好的代码习惯

ABAP程序基本上都需要从数据库里面抓数&#xff0c;所以性能很重要&#xff0c;同时有一些基本的&#xff0c;和优秀的写法是我们必须要掌握的&#xff0c;不然就会造成程序性能很差。下面给予总结&#xff08;这里包括有很基本的&#xff0c;也包括有比较少用到的&#xff09;…

python——案例六:判断字符串的长度

案例六&#xff1a;判断字符串的长度str"Study"print(len(str))#输出结果如下&#xff1a; #5

春秋云镜 CVE-2020-25540

春秋云镜 CVE-2020-25540 Thinkadmin v6任意文件读取漏洞 靶标介绍 ThinkAdmin 6版本存在路径查找漏洞&#xff0c;可利用该漏洞通过GET请求编码参数任意读取远程服务器上的文件。 启动场景 漏洞利用 1、未授权列目录poc 读取网站根目录Payload: http://think.admin/Think…

基于Vgg16和Vgg19深度学习网络的步态识别系统matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 MATLAB2022A 3.部分核心程序 ................................................................ % 设置训练选项options …

用Python获取链家二手房房源数据,做可视化图分析数据

前言 数据采集的步骤是固定: 发送请求, 模拟浏览器对于url地址发送请求获取数据, 获取网页数据内容 --> 请求那个链接地址, 返回服务器响应数据解析数据, 提取我们需要的数据内容保存数据, 保存本地文件 所需模块 win R 输入cmd 输入安装命令 pip install 模块名 (如果你…

js2-js中的数据结构

1、什么是数据结构 数据结构是计算机存储、组织数据的方式。 数据结构意味着接口或封装&#xff0c;一个数据结构可被视为两个函数之间的接口&#xff0c;或者是由数据类型联合组成的存储内容的访问方法封装。 每天的编码中都会用到数据结构&#xff0c;其中数组是最简单的内存…

VSCode如何在行内显示变量值

背景 在调试时&#xff0c;我们希望能够直接在代码行显示变量的值&#xff0c;而不是总是去侧边栏查看&#xff0c;如下这种&#xff0c;y12直接显示在代码行。那么VSCode中如何做呢 设置 VSCode提供了“inline values”设置&#xff0c;但为了速度&#xff0c;默认并没有开…

Linux 的基本指令(3)

指令1&#xff1a;date 作用&#xff1a;用来获取时间的指令。 1. 获取当下的时间&#xff1a; date %Y-%m-%d_%H:%M:%S 其中&#xff1a;%Y 表示年&#xff0c;%m 表示月&#xff0c;%d 表示日&#xff0c;%H 表示 小时&#xff0c;%M 表示分&#xff0c;%S 表示秒。 上面代…

什么是GCC

GCC&#xff08;GNU Compiler Collection&#xff0c;GNU编译器套件&#xff09;是由 GNU 开发的编程语言译器。GNU 编译器套件包括 C、C、Objective-C、Java、Ada 和 Go 语言前端&#xff0c;也包括了这些语言的库&#xff08;如 libstdc&#xff0c;libgcj等&#xff09; GC…

什么是芯片?

https://zhuanlan.zhihu.com/p/228757435?utm_sourceweibo&utm_mediumsocial&utm_oi895441374156029952&utm_contentsnapshot 什么是芯片&#xff1f; 半导体&#xff1a;一种材料&#xff0c;导电性能介于导体和半导体之间&#xff0c;比如硅、锗、砷化镓。用这…

安卓5.x安装Termux

由于Termux7.9版本之后&#xff0c;仅支持7.0以上的安卓系统。这里使用旧版本进行安装。 版本信息&#xff1a; 安卓 5.0.1 Termux 7.9 1. 下载Termux7.9 https://archive.org/details/termux-repositories-legacy#reviews 拷贝到手机后&#xff0c;进行安装。 安装完Termux…

全网最细,Fiddler修改接口返回数据详细步骤实战,辅助接口测试...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 在测试的过程中&a…