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站搜动脑学院 视频链接 &…

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…

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…

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…

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

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

(十三)【Jmeter】线程(Threads(Users))之tearDown 线程组

简述 操作路径如下: 作用:在正式测试结束后执行清理操作,如关闭连接、释放资源等。配置:设置清理操作的采样器、执行顺序等参数。使用场景:确保在测试结束后应用程序恢复到正常状态,避免资源泄漏或对其他测试的影响。优点:提供清理操作,确保测试环境的整洁和可重复性…

租用海外服务器,自己部署ChatGPT-Next-Web,实现ChatGPT聊天自由,还可以分享给朋友用

前言 如果有好几个人需要使用ChatGPT&#xff0c;又没有魔法上网环境&#xff0c;最好就是自己搭建一个海外的服务器环境&#xff0c;然后很多人就可以同时直接用了。 大概是情况是要花80元租一个一年的海外服务器&#xff0c;花15元租一个一年的域名&#xff0c;然后openai 的…

一 些有代表性的相位解包裹算法

Itoh首先给出了传统解包裹算法的数学描述!。传统的相位解包裹操作是通过对空间相邻点相位值的比较来完成的。根据抽样定理&#xff0c;如果相邻采样点的相位差不超过z&#xff0c;则对应的相位解包裹处理是非常简单的&#xff0c;理论上以某点为起始点沿某一路径对包裹相位的差…

中科院计算所:什么情况下,大模型才需要检索增强?

ChatGPT等大型语言模型在自然语言处理领域表现出色。但有时候会表现得过于自信&#xff0c;对于无法回答的事实问题&#xff0c;也能编出一个像样的答案来。 这类胡说乱说的答案对于医疗等安全关键的领域来说&#xff0c;是致命的。 为了弥补这一缺陷&#xff0c;研究者们提出…

ios抓包Tunnel to......443

fiddler官网下载“CertMaker for iOS and Android”插件&#xff0c;官网插件&#xff1a;https://www.telerik.com/fiddler/add-ons 双击运行插件后&#xff0c;重启fiddler&#xff0c;ios重新安装证书即可

猫头虎分享已解决Bug || 系统更新失败(System Update Failure):UpdateError, UpgradeFailure

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

Sora:视频生成模型作为世界模拟器

我们探索了视频数据上生成模型的大规模训练。具体来说&#xff0c;我们在可变持续时间、分辨率和长宽比的视频和图像上联合训练文本条件扩散模型。我们利用了一个在视频和图像潜在码的时空块上操作的变压器架构。我们规模最大的模型 Sora 能够生成一分钟的高保真视频。我们的结…