IO接口 IPC两个文件对话

实现AB进程对话。
1. A进程发送一-句话后, B进程接收到打印。然后B进程发送一句话,A进程接收后打印
2.重复上述步骤。直到AB接收或者发送完quit后, 结束AB进程

A文件
#include <func.h>
#include <stdio.h>
#include <errno.h>

int main(int argc, const char *argv[])
{
    if(mkfifo("./fifo" ,0664) < 0)
    {
    //  printf("errno= %d\n", errno);
        if(errno != 17)
        {
            perror("mkfifo");
            return -1;
        }
    }
        printf("mkfipo success\n");

    ssize_t dir = 0;
    ssize_t dev = 0;
    char arr[128];
    char brr[128];
    while(1)
    {
        int fp = open("./fifo", O_WRONLY);  
        //写入
        fgets(arr, sizeof(arr), stdin);
        arr[strlen(arr)-1] = '\0';
        dir = write(fp, arr, sizeof(arr));
        if(strcmp(arr, "quit") == 0)
        {
            printf("退出\n");
            break;
        }
        close(fp);
        //接收
       fp = open("./fifo", O_RDONLY);
        dev = read(fp, brr, sizeof(brr));
        if(dev == 0)
        {
            printf("b文件退出\n");
            break;
        }
        printf("wdonly:%s\n", brr);
        close(fp);
    }
    return 0;
}
B文件
#include <func.h>
#include <stdio.h>
#include <errno.h>

int main(int argc, const char *argv[])
{
    if(mkfifo("./fifo" ,0664) < 0)
    {
    //  printf("errno= %d\n", errno);
        if(errno != 17)
        {
            perror("mkfifo");
            return -1;
        }
    }
        printf("mkfipo success\n");

    ssize_t dev = 0;
    ssize_t dir = 0;
    char arr[128];
    char brr[128];
    while(1)
    {
      int fp = open("./fifo", O_RDONLY);
        //接受文件
        dev = read(fp, arr, sizeof(arr));
        if(dev == 0)
        {
            printf("b文件退出\n");
            break;
        }
        printf("wdonly:%s\n", arr);
        close(fp);
        //写入传入b文件
        fp = open("./fifo", O_WRONLY);
        fgets(brr, sizeof(brr), stdin);
        arr[strlen(brr)-1] = '\0';
        dir = write(fp,brr, sizeof(brr));
        if(strcmp(brr, "quit") == 0)
        {
            printf("退出\n");
            break;
        }
        close(fp);
    }
    return 0;
}                                             
现象
1.有三个线程,ID号分别为ABC,且每个线程中都在循环打印自己的ID。要求打印的结果为ABC。
 #include <func.h>
 #include <stdio.h>
 char buf[3] = {'A', 'B', 'C'};
 int  flag = 0;
 pthread_mutex_t mutex;
 pthread_cond_t cond;
 pthread_cond_t cond1;
 pthread_cond_t cond2;
 void * callbakc(void * arg)
 {
     while(1)
     {
         /**********临界资源************/
         //上锁
         pthread_mutex_lock(&mutex);
         if(flag != 0)
         {
             //休眠 解锁 尝试上锁 或者休眠
             pthread_cond_wait(&cond, &mutex);
         }
 
         printf(" %c ", buf[0]);
 
         flag = 1;
         //唤醒
         pthread_cond_signal(&cond1);
         //解锁
         ///**********临界资源************/
         pthread_mutex_unlock(&mutex);
     }
     pthread_exit(NULL);
 }
 void * callbakc1(void * arg)
 {
 
     while(1)
     {
         /**********临界资源************/
         //上锁
         pthread_mutex_lock(&mutex);
         if(flag != 1)                                             
         {
             //休眠 解锁 尝试上锁 或者休眠
             pthread_cond_wait(&cond1, &mutex);
             //若尝试上锁成功, 那就接着运行后面的代码
             //若尝试上锁失败,那就会休眠到cond上面
         }
 
         printf(" %c ", buf[1]);
         flag = 2;
         //换醒
         pthread_cond_signal(&cond2);
         //解锁
         pthread_mutex_unlock(&mutex);
         /*********临界资源********/
     }
 
     pthread_exit(NULL);
 }
 
 void * callbakc2(void * arg)
 {
     while(1)
     {
         /**********临界资源************/
         //上锁
         pthread_mutex_lock(&mutex);
         if(flag != 2)
         {
             //休眠 解锁 尝试上锁 或者休眠
             pthread_cond_wait(&cond2, &mutex);
             //若尝试上锁成功, 那就接着运行后面的代码
             //若尝试上锁失败,那就会休眠到cond上面
         }
         printf(" %c \n", buf[2]);
         flag = 0;
         //换醒
         pthread_cond_signal(&cond);
         //解锁
         pthread_mutex_unlock(&mutex);
         /*********临界资源********/
     }
     pthread_exit(NULL);
 
 
 }
 
 int main(int argc, const char *argv[])
 {
     //创建互斥锁
     pthread_mutex_init(&mutex, NULL);
     //创建条件变量
     pthread_cond_init(&cond, NULL);
     pthread_cond_init(&cond1, NULL);
     pthread_cond_init(&cond2, NULL);
     pthread_t tid;
     pthread_t tid1;
     pthread_t tid2;
     pthread_create(&tid, NULL, callbakc,NULL);
     pthread_create(&tid1, NULL,callbakc1,NULL);
     pthread_create(&tid2, NULL, callbakc2,NULL);
 
     pthread_join(tid, NULL);
     pthread_join(tid1, NULL);
     pthread_join(tid2, NULL);
 
     pthread_mutex_destroy(&mutex);
     return 0;
 }
现象
重点 用多条件变量

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

面试必考精华版Leetcode1137. 第 N 个泰波那契数

题目&#xff1a; 代码&#xff08;首刷看解析&#xff09;&#xff1a; class Solution { public:int tribonacci(int n) {// 1.初始化if(n0) return 0;else if(n1) return 1;else if(n2) return 1;int p0,q1,r1;int s0;// 2.遍历方向 左 → 右for(int i 3; i < n ; i)…

openwrt docker nginx 站点搭建

应为家里一直是 openwrt 软路由&#xff0c;这样以来也不用 重新买服务器了&#xff0c;就直接在 openwrt 上面跑个 nginx就行了。把自己的一些东西就可以放上面了。资源再利用哈哈&#xff1b; 先 ssh 连接上 openwrt &#xff1a;我这里的 openwrt 最近刚更新的固件&#xff…

金蝶云星空修改业务对象标识

文章目录 金蝶云星空修改业务对象标识说明解决方案具体操作实操 金蝶云星空修改业务对象标识 说明 一个业务对象的产生&#xff0c;涉及10个表起。 解决方案 还是手工删除重新创建保险。 具体操作 先备份需要删除的元数据&#xff0c;或者扩展&#xff0c;然后重新创建或…

Python给exe添加以管理员运行的属性

需求 有些应用每次启动都需要用管理员权限运行&#xff0c;比如Python注入dll时&#xff0c;编辑器或cmd就需要以管理员权限运行&#xff0c;不然注入就会失败。 这篇文章用编程怎么修改配置实现打开某个软件都是使用管理员运行&#xff0c;就不用每次都右键点击以管理员身份…

Unity SRP 管线【第四讲:URP 阴影】

URP 全文源码解析参照 引入 在UniversalRenderer.cs/ line 505行处 此处已经准备好了所有渲染数据&#xff08;所有数据全部存储在了renderingData中&#xff09; 我们只用renderingData中的数据初设置mainLightShadows bool mainLightShadows m_MainLightShadowCasterPass…

德人合科技 | 防止公司电脑文件数据资料外泄,自动智能透明加密保护系统

【透明加密软件】——防止公司电脑文件数据资料防止外泄&#xff0c;自动智能透明加密保护内部核心文件、文档、图纸、源代码、音视频等资料&#xff01; PC端访问地址&#xff1a; www.drhchina.com &#x1f31f; 核心功能&#xff1a; 透明加密&#xff1a;采用高级加密算…

VR虚拟动漫角色智能化导览丰富体验乐趣

AI数字人助理可以为我们带来哪些帮助? 随着人工智能技术的不断发展&#xff0c;AI数字人助理已经成为了我们日常生活和工作中的得力助手。它们具备智能感知、语音识别、自然语言处理等多种技能&#xff0c;可以为我们带来很多帮助和便利。 一、提高工作效率 AI数字人助理可以帮…

SCC-Tarjan,缩点问题

文章目录 前言引例什么是缩点&#xff1f;缩点的应用一、合并强连通子图为强连通图题目描述输入/输出格式原题链接题目详解 二、集合间偏序关系题目描述输入/输出格式原题链接题目详解 三、最大点权和路径题目描述输入/输出格式原题链接题目详解 其他OJ练习 前言 图论中的缩点问…

【MySQL·8.0·源码】MySQL 语法树基础知识

基础 我们都知道 SQL 语句经过词法分析器时&#xff0c;识别扫描输入的 SQL 语句&#xff0c;将关键词、标识符、常量等分解转换成独立的 tokens&#xff0c;进一步在语法分析阶段根据语法规则检查 tokens 序列的结构并不断 shift 、reduce 构建成 SQL 语法解析树。 在 MySQL…

ubuntu18.04 64 位安装笔记——备赛笔记——2024全国职业院校技能大赛“大数据应用开发”赛项——任务2:离线数据处理

进入VirtuakBox官网&#xff0c;网址链接&#xff1a;Oracle VM VirtualBoxhttps://www.virtualbox.org/ 网页连接&#xff1a;Ubuntu Virtual Machine Images for VirtualBox and VMwarehttps://www.osboxes.org/ubuntu/ 将下发的ds_db01.sql数据库文件放置mysql中 12、编写S…

19 高速列车场景下3Gpp 5G NR的DMRS设计与评估

文章目录 解决问题设计DMRS仿真参数仿真结果 解决问题 多普勒/扩展影响十分显著&#xff0c;设计用于信道估计时&#xff0c;需要考虑解调参考信号&#xff0c;5G用DMRS结构而不是CRS结构&#xff0c;因此需要为高速UE设计DMRS结构&#xff0c;DMRS设计是为了提高信道估计并减…

jdk多版本切换环境变量管理(jdk1.8和jdk17)

jdk多版本切换环境变量管理&#xff08;jdk1.8和jdk17&#xff09; 看了很多网上的博客&#xff0c;根本都不行&#xff0c;我总结出来规律如下&#xff1a; 首先环境变量要配置成这个样子&#xff1a;这些博客都会教你们配 接着配什么classpath&#xff0c;看其他博客就行 还…

百度地图添加坐标点,并返回坐标信息

1、创建地图容器 在mounted中初始化地图、鼠标绘制工具和添加鼠标监听事件 vue data中添加地图和绘制工具对象 2、添加初始化化地图方法 initMap(longitude, latitude) {let that thisthat.map new BMapGL.Map("container");// 创建地图实例if (longitude null ||…

亿某通电子文档安全管理系统任意文件上传漏洞 CNVD-2023-59471

1.漏洞概述 亿某通电子文档安全管理系统是一款电子文档安全防护软件,该系统利用驱动层透明加密技术,通过对电子文档的加密保护,防止内部员工泄密和外部人员非法窃取企业核心重要数据资产。亿赛通电子文档安全管理系统UploadFileFromClientServiceForClient接口处存在任意文件…

大创项目推荐 深度学习 opencv python 公式识别(图像识别 机器视觉)

文章目录 0 前言1 课题说明2 效果展示3 具体实现4 关键代码实现5 算法综合效果6 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 基于深度学习的数学公式识别算法实现 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学…

2024年【建筑电工(建筑特殊工种)】报名考试及建筑电工(建筑特殊工种)新版试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年建筑电工(建筑特殊工种)报名考试为正在备考建筑电工(建筑特殊工种)操作证的学员准备的理论考试专题&#xff0c;每个月更新的建筑电工(建筑特殊工种)新版试题祝您顺利通过建筑电工(建筑特殊工种)考试。 1、【单…

内网离线搭建之----nginx高可用

1.系统版本 虚拟机192.168.9.184 虚拟机192.168.9.185 2.nginx以及依赖下载地址 nginx&#xff1a;nginx: download pcre&#xff1a;PCRE - Browse /pcre/8.45 at SourceForge.net zlib&#xff1a;zlib Home Site 基本都在置顶的资源里 3.检查环境安装依赖的依赖&#xf…

RS232转profinet网关扫码枪自由口与1500程序对比

RS232转profinet网关&#xff08;XD-PNR200&#xff09;自由口是一种用于将RS232串口信号转换为profinet协议的设备&#xff0c;它具有自由口的功能。本文以某自动化生产线为例进行案例研究。通过RS232转Profinet网关&#xff08;XD-PNR200&#xff09;&#xff0c;将生产线的多…

Elasticsearch 【版本7.X】之常用的语法大全

文章目录 监控相关 API 查看健康状况查看所有节点查看所有节点详细信息查看主节点查看所有索引查看所有分片 索引管理 创建索引查看索引查看索引字段类型修改索引字段删除索引别名 给索引添加别名查询某个索引下的别名给索引更换别名给索引解绑别名一个别名绑定多个索引查询ind…

xv6 文件系统(上)

〇、前言 本文将会结合 xv6 源码讨论文件系统的工作原理。 一、文件系统实现概述 xv6 文件系统可以用下面的图来表示&#xff1a; 按照分层的方式进行理解&#xff1a; 在最底层是磁盘&#xff0c;也就是一些实际保存数据的存储设备&#xff0c;正是这些设备提供了持久化存…