IO进程线程第6天

1.使用有名管道完成两个进程的相互通信

send.c代码如下:

#include <myhead.h>int main(int argc, const char *argv[])
{pid_t pid=fork();if(pid>0){//父进程//从管道1中读取数据int fd=-1;if((fd=open("./mkfifo1",O_RDONLY))==-1){perror("open error");return -1;}char rbuf[128]="";while(1){bzero(rbuf,sizeof(rbuf));//	printf("请输入>>>:");//	fgets(wbuf,sizeof(wbuf),stdin);//	wbuf[strlen(wbuf)-1]=0;read(fd,rbuf,sizeof(rbuf));if(strcmp(rbuf,"quit")==0){break;}printf("从程序A中读取的数据:%s\n",rbuf);}close(fd);}else if(pid==0){//子进程 //向管道2中写入数据int fd1=-1;if((fd1=open("./mkfifo2",O_WRONLY))==-1){perror("open error");return -1;}char wbuf[128]="";while(1){bzero(wbuf,sizeof(wbuf));//	printf("请输入>>>:");fgets(wbuf,sizeof(wbuf),stdin);wbuf[strlen(wbuf)-1]=0;write(fd1,wbuf,sizeof(wbuf));if(strcmp(wbuf,"quit")==0){break;}//	printf("程序B发送的消息:%s\n",rbuf);}close(fd1);}else{perror("fork error");return -1;}return 0;
}

recv.c代码如下:

#include <myhead.h>int main(int argc, const char *argv[])
{pid_t pid=fork();if(pid>0){//父进程//向管道1中写入数据int fd=-1;if((fd=open("./mkfifo1",O_WRONLY))==-1){perror("open error");return -1;}char wbuf[128]="";while(1){bzero(wbuf,sizeof(wbuf));//	printf("请输入>>>:");fgets(wbuf,sizeof(wbuf),stdin);wbuf[strlen(wbuf)-1]=0;write(fd,wbuf,sizeof(wbuf));if(strcmp(wbuf,"quit")==0){break;}}close(fd);}else if(pid==0){//子进程 //从管道2中读取数据int fd1=-1;if((fd1=open("./mkfifo2",O_RDONLY))==-1){perror("open error");return -1;}char rbuf[128]="";while(1){bzero(rbuf,sizeof(rbuf));read(fd1,rbuf,sizeof(rbuf));if(strcmp(rbuf,"quit")==0){break;}printf("程序B发送的消息:%s\n",rbuf);}close(fd1);}else{perror("fork error");return -1;}return 0;
}

create.c代码如下:

#include <myhead.h>int main(int argc, const char *argv[])
{if(mkfifo("./mkfifo1",0664)==-1){perror("mkfifo error");return -1;}if(mkfifo("./mkfifo2",0664)==-1){perror("mkfifo error");return -1;}getchar();system("rm mkfifo1");system("rm mkfifo2");return 0;
}

运行结果:

2.关于互斥机制的代码实现

#include <myhead.h>
int num=200;//定义一个锁资源
pthread_mutex_t mutex;void *task1(void *arg)
{//对访问的临界资源进行上锁pthread_mutex_lock(&mutex);num=120;printf("task1 num=%d\n",num);//解锁pthread_mutex_unlock(&mutex);pthread_exit(NULL);
}void *task2(void *arg)
{//对访问的临界资源进行上锁pthread_mutex_lock(&mutex);sleep(1);num++;printf("task2 num=%d\n",num);pthread_mutex_unlock(&mutex);pthread_exit(NULL);
}
int main(int argc, const char *argv[])
{//初始化锁pthread_mutex_init(&mutex,NULL);pthread_t tid1,tid2;if(pthread_create(&tid1,NULL,task1,NULL)!=0){perror("pthread_create error");return -1;}if(pthread_create(&tid2,NULL,task2,NULL)!=0){perror("pthread_create error");return -1;}pthread_join(tid1,NULL);pthread_join(tid2,NULL);//释放锁资源pthread_mutex_destroy(&mutex);return 0;
}

运行结果:

3.无名信号量的代码实现如下 :

#include <myhead.h>
//实现无名信号量
//定义无名信号量
sem_t sem1,sem2,sem3;void *task1(void *arg)
{int num=5;while(num--){sem_wait(&sem1);printf("A");sem_post(&sem2);}pthread_exit(NULL);
}void *task2(void *arg)
{int num=5;while(num--){sem_wait(&sem2);printf("B");sem_post(&sem3);}pthread_exit(NULL);
}void *task3(void *arg)
{int num=5;while(num--){sem_wait(&sem3);printf("C\n");sem_post(&sem1);}pthread_exit(NULL);
}
/**************主程序******************/
int main(int argc, const char *argv[])
{//初始化无名信号量sem_init(&sem1,0,1);sem_init(&sem2,0,0);sem_init(&sem3,0,0);pthread_t tid1,tid2,tid3;if(pthread_create(&tid1,NULL,task1,NULL)!=0){perror("pthread_create error");return -1;}if(pthread_create(&tid2,NULL,task2,NULL)!=0){perror("pthread_create error");return -1;}if(pthread_create(&tid3,NULL,task3,NULL)!=0){perror("pthread_create error");return -1;}pthread_join(tid1,NULL);pthread_join(tid2,NULL);pthread_join(tid3,NULL);return 0;
}

运行结果:

4.实现条件变量代码如下:

#include <myhead.h>
//定义一个条件变量
pthread_cond_t cond;
//定义一个互斥锁
pthread_mutex_t mutex;
void *task1(void *arg)
{int num=5;while(num--){sleep(2);printf("tid1生产了一辆奔驰车\n");//唤醒等待队列中的线程pthread_cond_signal(&cond);}pthread_exit(NULL);
}void *task2(void *arg)
{//上锁pthread_mutex_lock(&mutex);pthread_cond_wait(&cond,&mutex);printf("消费了一辆车\n");//解锁pthread_mutex_unlock(&mutex);pthread_exit(NULL);
}int main(int argc, const char *argv[])
{//初始化条件变量pthread_cond_init(&cond,NULL);//初始化一个互斥锁pthread_mutex_init(&mutex,NULL);pthread_t tid1,tid2,tid3,tid4,tid5,tid6;if(pthread_create(&tid1,NULL,task1,NULL)!=0){perror("pthread_create error");return -1;}if(pthread_create(&tid2,NULL,task2,NULL)!=0){perror("pthread_create error");return -1;}if(pthread_create(&tid3,NULL,task2,NULL)!=0){perror("pthread_create error");return -1;}if(pthread_create(&tid4,NULL,task2,NULL)!=0){perror("pthread_create error");return -1;}if(pthread_create(&tid5,NULL,task2,NULL)!=0){perror("pthread_create error");return -1;}if(pthread_create(&tid6,NULL,task2,NULL)!=0){perror("pthread_create error");return -1;}//回收线程资源pthread_join(tid1,NULL);pthread_join(tid2,NULL);pthread_join(tid3,NULL);pthread_join(tid4,NULL);pthread_join(tid5,NULL);pthread_join(tid6,NULL);//释放锁pthread_mutex_destroy(&mutex);//释放条件变量pthread_cond_destroy(&cond);return 0;
}

运行结果:

5.无名管道代码实现如下:

#include <myhead.h>int main(int argc, const char *argv[])
{int pipefd[2]={0};if(pipe(pipefd)==-1){perror("pipe error");return -1;}pid_t pid=fork();if(pid>0){//父进程close(pipefd[0]);char wbuf[128]="";while(1){bzero(wbuf,sizeof(wbuf));//	printf("请输入>>>>");fgets(wbuf,sizeof(wbuf),stdin);wbuf[strlen(wbuf)-1]=0;write(pipefd[1],wbuf,sizeof(wbuf));if(strcmp(wbuf,"quit")==0){break;}}close(pipefd[1]);}else if(pid==0){//子进程close(pipefd[1]);char rbuf[128]="";while(1){bzero(rbuf,sizeof(rbuf));read(pipefd[0],rbuf,sizeof(rbuf));if(strcmp(rbuf,"quit")==0){break;}printf("接收的内容为:%s\n",rbuf);}close(pipefd[0]);}else{perror("fork error");return -1;}return 0;
}

运行结果:

6.有名管道代码实现如下:

create.c

#include <myhead.h>int main(int argc, const char *argv[])
{if(mkfifo("./mk",0664)==-1){perror("mkfifo error");return -1;}getchar();system("rm mk");return 0;
}

send.c

#include <myhead.h>int main(int argc, const char *argv[])
{if(mkfifo("./mk",0664)==-1){perror("mkfifo error");return -1;}getchar();system("rm mk");return 0;
}
ubuntu@ubuntu:home$ cat mkfifo.c 
#include <myhead.h>
//使用有名管道完成不同进程之间的通信
int main(int argc, const char *argv[])
{int wfd=-1;if((wfd=open("./mk",O_WRONLY))==-1){perror("open error");return -1;}char wbuf[128]="";while(1){bzero(wbuf,sizeof(wbuf));fgets(wbuf,sizeof(wbuf),stdin);wbuf[strlen(wbuf)-1]=0;write(wfd,wbuf,sizeof(wbuf));if(strcmp(wbuf,"quit")==0){break;}}close(wfd);return 0;
}

recv.c

#include <myhead.h>int main(int argc, const char *argv[])
{int rfd=-1;if((rfd=open("./mk",O_RDONLY))==-1){perror("open error");return -1;}char rbuf[128]="";while(1){bzero(rbuf,sizeof(rbuf));read(rfd,rbuf,sizeof(rbuf));if(strcmp(rbuf,"quit")==0){break;}printf("收到的消息:%s\n",rbuf);}close(rfd);return 0;
}

运行结果:

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

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

相关文章

【安卓基础3】Activity(一)

&#x1f3c6;作者简介&#xff1a;|康有为| &#xff0c;大四在读&#xff0c;目前在小米安卓实习&#xff0c;毕业入职 &#x1f3c6;本文收录于 安卓学习大全&#xff0c;欢迎关注 &#x1f3c6;安卓学习资料推荐&#xff1a; 视频&#xff1a;b站搜动脑学院 视频链接 &…

微信小程序开发教程:

准备工作 下载并安装微信开发者工具注册微信公众平台账号并创建小程序项目 项目结构 app.js&#xff1a;小程序的入口文件&#xff0c;用于定义全局变量和函数app.json&#xff1a;小程序的全局配置文件&#xff0c;用于配置小程序的页面、窗口样式、网络超时时间等app.wxss&am…

反光衣实时识别检测系统-反光衣穿戴识别系统-智慧工地系统安全帽佩戴---豌豆云

反光衣实时识别检测系统是根据视频流的自动化图像识别检测&#xff0c;运用前沿的深度神经网络与云计算技术&#xff0c;替代工作人员的眼睛。 在工地、化工厂、煤矿石化等生产安全地区部署反光衣实时识别检测系统&#xff0c;运用现场已有的视频监控可以无死角全自动检测生产…

Sora横空出世!AI将如何撬动未来?

近日&#xff0c;OpenAI 发布首个视频生成“Sora”模型&#xff0c;该模型通过接收文字指令&#xff0c;即可生成60秒的短视频。 而在2022年末&#xff0c;同样是OpenAI发布的AI语言模型ChatGPT&#xff0c;简化了文本撰写、创意构思以及代码校验等任务。用户仅需输入一个指令&…

【IC设计】Chisel API之Arbiter和RRArbiter的使用

文章目录 介绍Chisel的Valid和Ready流控build.sbtRRArbiter代码示例 介绍 仲裁器在NoC路由器中是重要的组成部分&#xff0c;虚通道仲裁和交叉开关仲裁都需要使用仲裁器。 Chisel提供了Arbiter和RRArbiter仲裁器 Arbiter是基础的低位优先仲裁器&#xff0c; RRArbiter初始情况…

前端构建效率优化之路

项目背景 我们的系统&#xff08;一个 ToB 的 Web 单页应用&#xff09;前端单页应用经过多年的迭代&#xff0c;目前已经累积有大几十万行的业务代码&#xff0c;30 路由模块&#xff0c;整体的代码量和复杂度还是比较高的。 项目整体是基于 Vue TypeScirpt&#xff0c;而构…

ProtoBuf认识与Windows下的安装

protobuf简介 Protobuf 是 Protocol Buffers 的简称&#xff0c;它是 Google 公司开发的一种数据描述语言&#xff0c;是一种轻便高效的结 构化数据存储格式&#xff0c;可以用于结构化数据&#xff0c;或者说序列化。它很适合做数据存储 或 RPC 数据交换格 式 。可用于通讯…

WebServer -- 定时器处理非活动连接(上)

目录 &#x1f34d;函数指针 &#x1f33c;基础知识 &#x1f419;整体概述 &#x1f382;基础API sigaction 结构体 sigaction() sigfillset() SIGALRM, SIGTERM 信号 alarm() socketpair() send() &#x1f4d5;信号通知流程 统一事件源 信号处理机制 &#x…

2024全球网络安全展望|构建协同生态,护航数字经济

2024年1月&#xff0c;世界经济论坛发布《2024全球网络安全展望》报告&#xff0c;指出在科技快速发展的背景下&#xff0c;网络安全不均衡问题加剧&#xff0c;需加强公共部门、企业组织和个人的合作。 报告强调&#xff0c;面对地缘政治动荡、技术不确定性和全球经济波动&am…

基于springboot+vue的美发门店管理系统(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

Python 高级语法:一切皆对象

1 “一切皆对象”是一种核心设计哲学 在编程领域&#xff0c;特别是面向对象编程&#xff08;OOP&#xff09;中&#xff0c;“一切皆对象”是一种核心设计哲学。这种哲学主张&#xff0c;无论是数据、函数、还是更复杂的结构&#xff0c;都可以被视为对象&#xff0c;并赋予…

信息安全基本概念汇总

目录 一、安全加密算法相关 二、信息安全需求规范相关 三、安全启动 四、安全更新 五、安全通信SecOC 六、HSM安全固件整体架构 一、安全加密算法相关 基于Autosar的网络安全理解_搜狐汽车_搜狐网 基于AES的CMAC算法、MAC、Hash、数字签名之间的关系_aes cmac-CSDN博客…

Cartographer框架简述

catographer框架分为前端和后端 前端包括雷达数据处理&#xff1b;位姿预测&#xff1b;扫描匹配和栅格地图更新。 后端包括后端&#xff1a;线程池任务与调度&#xff1b;向位姿图添加节点&#xff0c;计算节点的子图内约束和子图间约束&#xff08;回环检测&#xff09;&…

C++之Easyx——图形库的基本功能(1):界面操作

最近&#xff0c;我觉得使用控制台编写游戏太没意思了&#xff01;&#xff01; 所以我开始研究图形库了~ 一、setinitmode 函数定义 void EGEAPI setinitmode(int mode, int x CW_USEDEFAULT, int y CW_USEDEFAULT); //设置初始化模式&#xff0c;mode0为普通&#xff0c…

Spark中写parquet文件是怎么实现的

背景 本文基于 Spark 3.5.0 写本篇文章的目的是在于能够配合spark.sql.maxConcurrentOutputFileWriters参数来加速写parquet文件的速度&#xff0c;为此研究一下Spark写parquet的时候会占用内存的大小&#xff0c;便于配置spark.sql.maxConcurrentOutputFileWriters的值&#…

Javascript怎么输出内容?两种常见方式以及控制台介绍

javascript是一种非常重要的编程语言&#xff0c;在许多网页中它被广泛使用&#xff0c;可以实现许多交互效果和动态效果。输出是javascript中最基本的操作之一&#xff0c;下面将介绍两种常见的输出方式。 一、使用console.log()函数输出 console.log()函数是常用的输出函数…

Jmeter实现阶梯式线程增加的压测

安装相应jmeter 插件 1&#xff1a;安装jmeter 管理插件&#xff1a; 下载地址&#xff1a;https://jmeter-plugins.org/install/Install/&#xff0c;将下载下来的jar包放到jmeter文件夹下的lib/ext路径下&#xff0c;然后重启jmeter。 2&#xff1a;接着打开 选项-Plugins Ma…

在Linux上安装Docker: 一站式指南

Docker 是一款强大的容器化平台&#xff0c;为开发者提供了一种轻松打包、发布和运行应用的方式。在本文中&#xff0c;我们将探讨如何在Linux操作系统上安装Docker&#xff0c;为你提供一站式指南。 步骤1: 卸载旧版本 在安装新版Docker之前&#xff0c;建议先卸载旧版本&am…

三十年一个大轮回!日股突破“泡沫时期”历史高点

2月22日周四&#xff0c;英伟达四季报业绩超预期&#xff0c;而且本季度业绩指引非常乐观&#xff0c;提振美股股指期货并成为芯片股和AI概念股情绪的重要催化剂。今日亚洲芯片股和AI股起飞&#xff0c;日本在芯片股的带动下突破1989年泡沫时期以来的历史最高收盘价。 美股方面…

我之前炒股亏麻了,找百融云AI Agent谈了谈心

春节之前&#xff0c;A股和H股都跌麻了&#xff0c;但是机构的路演和调研反而多了。因为&#xff1a;写不完的安抚、说不完的陪伴、听不完的客户指责、以及捡不完的AH股便宜货。 有一位血液里流淌着美式咖啡的职场白领&#xff0c;虽然这些年在股市过得很不如意&#xff0c;但…