假期day3,三种进程间通信代码实现(2024/2/4)

news2024/11/29 22:55:46

消息队列

#include<myhead.h>
struct msgbuf{
    long mstype;
    char text[1024];
};

#define SIZE (sizeof(struct msgbuf)-sizeof(long))

int main(int argc, const char *argv[])
{

    int pid;

    //创建key值
    key_t key=ftok("/",'a');
    if(key ==-1){
        perror("creat key");
        return -1;
    }
    printf("key=%d\n",key);

    //创建消息队列
    int msgid=msgget(key,IPC_CREAT|0664);
    if(msgid==-1){
        perror("msgget");
        return -1;
    }

    struct msgbuf msg;

    pid=fork();
    if(pid>0)//父进程完成写入操作
    {
        while(1)
        {
            //写类型10的数据
            printf("请输入数据类型\n");
            scanf("%ld",&msg.mstype);
            printf("请输入数据\n");
            scanf("%s",msg.text);

            msgsnd(msgid,&msg,SIZE,0);
            if(strcmp(msg.text,"quit")==0)break;


        //删除消息队列
        if(msgctl(msgid,IPC_RMID,NULL)==-1){
            perror("msgctl error");
            return -1;
        }
        printf("删除完成\n");

    }else if(pid==0)//子进程完成读取操作
    {
        while(1)
        {
            msgrcv(msgid,&msg,SIZE,5,0);//读类型5的数据
            printf("收到信息:\n");
            printf("id=%ld,text=%s\n",msg.mstype,msg.text);
            if(strcmp(msg.text,"quit")==0)break;
        }
        exit(0);
    }else{
        perror("create pid");
        return -1;
    }
    
    wait(NULL);
    
    return 0;
}  

#include<myhead.h>
struct msgbuf{
    long mstype;
    char text[1024];
};

#define SIZE (sizeof(struct msgbuf)-sizeof(long))

int main(int argc, const char *argv[])
{

    int pid;

    //创建key值
    key_t key=ftok("/",'a');
    if(key ==-1){
        perror("creat key");
        return -1;
    }
    printf("key=%d\n",key);

    //创建消息队列
    int msgid=msgget(key,IPC_CREAT|0664);
    if(msgid==-1){
        perror("msgget");
        return -1;
    }

    struct msgbuf msg;

    pid=fork();
    if(pid>0)//父进程完成写入操作
    {
        while(1)
        {
            //写类型5的数据
            printf("请输入数据类型\n");
            scanf("%ld",&msg.mstype);
            printf("请输入数据\n");
            scanf("%s",msg.text);

            msgsnd(msgid,&msg,SIZE,0);
            if(strcmp(msg.text,"quit")==0)break;
        }

        //删除消息队列
        if(msgctl(msgid,IPC_RMID,NULL)==-1){
            perror("msgctl error");
            return -1;
        }
        printf("删除完成\n");

    }else if(pid==0)//子进程完成读取操作
    {
        while(1)
        {
            msgrcv(msgid,&msg,SIZE,10,0);//读类型10的数据
            printf("收到信息:\n");
            printf("id=%ld,text=%s\n",msg.mstype,msg.text);
            if(strcmp(msg.text,"quit")==0)break;
        }
        exit(0);
    }else{
        perror("create pid");
        return -1;
    }

    wait(NULL);

    return 0;
}  

在这里插入图片描述

有名管道进程间通信

半双工相互通信
#include<myhead.h>

//发送方线程
void* task1(void* arg){
    //创建管道文件
    if((mkfifo("myfifo",0664)) == -1){
        perror("mkfile error");
    }

    //打开管道描述符
    int wfd=-1;
    if((wfd=open("myfifo",O_WRONLY))==-1){
        perror("open write");
    }

    printf("输入quit为退出会话\n");

    char wbuf[128]="";
    while(1){
        printf("请输入您要发送的信息:\n");
        fgets(wbuf,sizeof(wbuf),stdin);
        wbuf[strlen(wbuf)-1]=0;

        write(wfd,wbuf,sizeof(wbuf));
        if(strcmp(wbuf,"quit")==0)
        {
            break;
        }
    }
    close(wfd);
    system("rm myfifo");

    pthread_exit(NULL);
}

//接收方线程
void* task2(void* arg){
    int rfd=-1;
    if((rfd=open("myfifo",O_RDONLY))==-1){
        perror("read error");
    }

    char rbuf[128]="";
    while(1){
        memset(rbuf,0,sizeof(rbuf));
        read(rfd,rbuf,sizeof(rbuf));
        printf("您收到一条信息:%s\n",rbuf);
        if(strcmp(rbuf,"quit")==0){
            break;
        }
    }
    close(rfd);
    pthread_exit(NULL);
}


int main(int argc, const char *argv[])
{
    //定义两个线程
    pthread_t tid1,tid2;
    int flag;
    while(1)
    {
        printf("------------------会话只能由发送方发起与结束--------------\n");
        printf("-----------------------选择1:发送信息-------------------\n");
        printf("-----------------------选择2:接收信息-------------------\n");
        printf("-------------------------选择0:退出---------------------\n");
        scanf("%d",&flag);
        switch(flag)
        {
            case 1:
                //线程一
                if((pthread_create(&tid1,NULL,task1,NULL)) !=0)
                {
                    printf("tid1 create error\n");
                    return -1;
                }
                pthread_join(tid1,NULL);
                break;
            case 2:
                //线程二
                if((pthread_create(&tid2,NULL,task2,NULL)) !=0)
                {
                    printf("tid1 create error\n");
                    return -1;
                }
                pthread_join(tid2,NULL);
                break;
            case 0:
                goto END;
        }
        printf("输入'#'字符结束,否则继续\n");
        char element;
        element=getchar();
        if(element == '#')break;
    }
END:
    return 0;
}   

在这里插入图片描述

无名管道

#include<myhead.h>

int main(int argc, const char *argv[])
{
    //定义进程号变量
    pid_t pid = -1;
    //定义存放管道文件描述符的数组
    int pipefd[2] = {0};

    //创建管道文件
    if(pipe(pipefd) == -1)
    {
        perror("pipe error");
        return -1;
    }

    printf("pipefd[0] = %d, pipefd[1] = %d\n", pipefd[0], pipefd[1]); //3 4




    //创建一个子进程
    pid = fork();
    if(pid > 0)
    {
        //父进程
        //关闭父进程中管道的读端
        close(pipefd[0]);

        char buf[128] = "";
        while(1)
        {
            //从终端上获取数据放入buf中
            fgets(buf, sizeof(buf), stdin);
            buf[strlen(buf)-1] = 0;          //将'\n'换成'\0'

            write(pipefd[1], buf, sizeof(buf));         //将数据写入管道文件中

            if(strcmp(buf, "quit") == 0)
            {
                break;
            }
        }


        //关闭写端
        close(pipefd[1]);


    }else if(pid == 0)
    {
        //子进程
        //子进程关闭管道的写端
        close(pipefd[1]);

        char rbuf[128] = "";
        while(1)
        {
            bzero(rbuf, sizeof(rbuf));    //将数组内容置0

            read(pipefd[0], rbuf, sizeof(rbuf));           //从管道文件中读取数据

            printf("收到父进程消息: %s\n", rbuf);             //hello  world

            if(strcmp(rbuf, "quit") == 0)
            {
                break;
            }
        }

        //关闭读端
        close(pipefd[0]);


        //退出子进程
        exit(EXIT_SUCCESS);
    }else
    {
        perror("fork error");
        return -1;
    }
    
    //父进程回收子进程的资源
    wait(NULL);

    return 0;
}

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

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

相关文章

033 三种初始化及内存分析

三种初始化 内存分析 创建数组后存储解析

租号平台源码 支持单独租用或合租使用

(购买本专栏可免费下载栏目内所有资源不受限制,持续发布中,需要注意的是,本专栏为批量下载专用,并无法保证某款源码或者插件绝对可用,介意不要购买) 这是一款租号平台源码,采用常见的租号模式。目前网络上还很少见到此类类型的源码。 平台的主要功能如下: 支持单独…

CTFshow 5——23

借鉴博客 misc5 下载完后&#xff0c;用winhex打开 在最后就可以找到flag misc6 和misc5一样 &#xff08;推测&#xff1a;可能是jpg这种看得见的图片&#xff0c;用winhex&#xff09; misc7 misc8 前置工具安装 这里可以看看见两个png 然后我们在我们的文件夹里面有个…

幻兽帕鲁服务器搭建:专用服务器设置全攻略

玩转幻兽帕鲁服务器&#xff0c;阿里云推出新手0基础一键部署幻兽帕鲁服务器教程&#xff0c;傻瓜式一键部署&#xff0c;3分钟即可成功创建一台Palworld专属服务器&#xff0c;成本仅需26元&#xff0c;阿里云服务器网aliyunfuwuqi.com分享2024年新版基于阿里云搭建幻兽帕鲁服…

使用Java编写HTTP客户端和服务器框架:一场“请求与响应”的舞蹈

在这个网络发达的时代&#xff0c;HTTP协议成为了我们与世界沟通的桥梁。而Java&#xff0c;这个强大的编程语言&#xff0c;给了我们工具去编写自己的HTTP客户端和服务器框架。这就像给了我们一套乐高积木&#xff0c;让我们自由地创造自己的城堡。 首先&#xff0c;我们来谈…

openlayers常用示例

简单说一下吧&#xff0c;最近做了十来天的的openlayers&#xff0c;然后稍微研究了一下&#xff0c;这里总结并做了一些示例给大家分享一下&#xff0c;应该是相对常用的一部分吧&#xff0c;由于做的时间比较短&#xff0c;这里写了十来个示例了&#xff0c;有实际项目用到的…

2024 springboot Mybatis-flex 打包出错

Mybatis-flex官网&#xff1a;快速开始 - MyBatis-Flex 官方网站 从 Mybatis-flex官网获取模板后&#xff0c;加入自己的项目内容想打包确保错&#xff0c;先试试一下方法 这里改成skip的默认是true改成false&#xff0c;再次打包就可以了

leetcode206反转链表|详细算法讲解学习

题目 https://leetcode.cn/problems/reverse-linked-list/ 这道题对于刚开始学习数据结构和算法的人来说有点难&#xff0c;是入门的重要典型题目&#xff1b;但等数据结构入门之后&#xff0c;这就会是一道非常简单的题目了。 算法一&#xff08;算法正确但超出时间限制&am…

C++算法学习心得七.贪心算法(3)

1.根据身高重建队列&#xff08;406题&#xff09; 题目描述&#xff1a; 假设有打乱顺序的一群人站成一个队列&#xff0c;数组 people 表示队列中一些人的属性&#xff08;不一定按顺序&#xff09;。每个 people[i] [hi, ki] 表示第 i 个人的身高为 hi &#xff0c;前面 …

day42_jdbc

今日内容 0 复习昨日 1 JDBC概述 2 JDBC开发步骤 3 完成增删改操作 4 ResultSet 5 登录案例 0 复习昨日 1 写出JQuery,通过获得id获得dom,并给input输入框赋值的语句 $(“#id”).val(“值”) 2 mysql内连接和外连接的区别 内连接只会保留完全符合关联条件的数据 外连接会保留表…

20240203-平常心

我一直强调自己要保持一颗平常心&#xff0c;耐住性子&#xff0c;过好每一刻&#xff0c;做好每一件事情&#xff0c;不断的向自己的目标去推进。就像图中的橙子一样&#xff0c;从刚收到这棵柠檬树的时候&#xff0c;我就在期待结果。 但是柠檬树的哗哗落叶、蔫啦吧唧&#x…

【GAMES101】Lecture 16 蒙特卡洛积分

为了后面要讲的路径追踪&#xff0c;需要讲一下这个蒙特卡洛积分&#xff0c;同时需要回顾一下高等数学中的微积分和概率论与统计学的知识 目录 微积分 概念论与统计 蒙特卡洛积分 微积分 定积分是微积分中的一种重要概念&#xff0c;用于计算函数在一个区间上的总体积、…

性能测试+Jmeter介绍

文章目录 什么是性能测试?性能测试的目的性能测试分类一般性能测试负载测试压力测试大数据量测试配置测试稳定性测试 性能测试术语虚拟用户并发及并发用户数响应时间每秒事务数吞吐量、吞吐率点击率性能计数器资源利用率 性能测试流程测试计划阶段测试设计阶段测试开发阶段测试…

自考怎么搜答案? #媒体#微信#经验分享

在大学生的学习生活中&#xff0c;遇到难题和疑惑是常有的事情。为了解决这个问题&#xff0c;越来越多的大学生开始使用搜题软件来帮助他们快速找到答案。今天&#xff0c;我将为大家分享几款大学生常用的搜题软件&#xff0c;让我们一起来看看它们的特点和优势吧&#xff01;…

Vulnhub-DC8

信息收集 # arp-scan -l Interface: eth0, type: EN10MB, MAC: 00:0c:29:43:7c:b1, IPv4: 192.168.1.60 Starting arp-scan 1.10.0 with 256 hosts (https://github.com/royhills/arp-scan) 192.168.1.1 00:50:56:c0:00:08 VMware, Inc. 192.168.1.2 00:50:56:f…

【Vue.js设计与实现】第二篇:响应系统-阅读笔记(持续更新)

从高层设计的角度去探讨框架需要关注的问题。 系列目录&#xff1a; 标题博客第一篇&#xff1a;框架设计概览【Vue.js设计与实现】第一篇&#xff1a;框架设计概览-阅读笔记第二篇&#xff1a;响应系统【Vue.js设计与实现】第二篇&#xff1a;响应系统-阅读笔记第三篇&#x…

spring-authorization-server 公共客户端方式获取授权码和Token的流程

spring-authorization-serve【版本1.2.1】官方文档中提及了关于RegisteredClient中所涉及的客户端身份验证方法&#xff0c;也就是RegisteredClient中提及的clientAuthenticationMethods属性对应的“none”值&#xff0c;目前clientAuthenticationMethods属性支持的值包含&…

Maven提示Failure to find com.oracle:ojdbc14:jar:10.2.0.4.0

目录 问题 解决方案 1、下载oracle的驱动jar包 2、安装到本地仓库 3、检查本地仓库是否成功安装 4、Maven先clean &#xff0c;再install。 问题 项目引入Oracle依赖后报错&#xff0c;显示为红色。 解决方案 1、下载oracle的驱动jar包 首先我们要去下载一个oracle的…

c语言--assert断言(详解)

目录 一、断言的概念二、assert断言2.1 代码12.1.1运行结果2.1.2分析 2.2代码22.2.1运行结果2.2.2分析2.3代码32.3.1运行结果及其分析 三、优点四、缺点五、注意 一、断言的概念 assert.h 头⽂件定义了宏 assert() &#xff0c;用于在运行时确保程序符合指定条件&#xff0c;如…

16- OpenCV:轮廓的发现和轮廓绘制、凸包

目录 一、轮廓发现 1、轮廓发现(find contour in your image) 的含义 2、相关的API 以及代码演示 二、凸包 1、凸包&#xff08;Convex Hull&#xff09;的含义 2、Graham扫描算法- 概念介绍 3、cv::convexHull 以及代码演示 三、轮廓周围绘制矩形和圆形框 一、轮廓发现…