IO和进程day07(IPC、管道、信号)

news2025/1/20 3:51:08

今日任务

1.代码(一次只能发一次消息,不然会存在一些小问题,在接受消息之后会立刻输出上次的第二次发送的消息)

read.c文件(先读取消息)

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
int main(int argc, const char *argv[])
{
	//创建打开第一个管道文件
	if(-1==mkfifo("./fifo1",0664)){
		if(17!=errno){
			perror("mkfifo1");
			return -1;
		}
	}
	puts("create pipe1 success");
	//打开管道文件
	int fd1=open("./fifo1",O_RDONLY);
	if(-1==fd1){
		perror("open1");
		return -1;
	}
	puts("open1 success");
	//创建打开第二个管道文件
	if(-1==mkfifo("./fifo2",0664)){
		if(17!=errno){
			perror("mkfifo2");
			return -1;
		}
	}
	puts("create pipe2 success");
	//打开管道文件
	int fd2=open("./fifo2",O_WRONLY);
	if(-1==fd2){
		perror("open2");
		return -1;
	}
	puts("open2 success");
	//读  写
	char buf1[128];
	char buf2[128];
	while(1){
		//读
		bzero(buf1,sizeof(buf1));
		int res=read(fd1,buf1,sizeof(buf1));
		if(res<0){
			perror("read");
			return -1;
		}else if(res==0){
			break;
		}else{
			printf("jack:%s\n",buf1);
			//fprintf(stdout,"jack:%s\n",buf1);
		}
		//写
		bzero(buf2,sizeof(buf2));
		//scanf("%s",buf2);
		fgets(buf2,sizeof(buf2),stdin);
		buf2[strlen(buf2)-1]='\0';
		if(strcmp(buf2,"quit")==0)
			break;
		if(-1==write(fd2,buf2,sizeof(buf2))){
			perror("write");
			return -1;
		}

	}

	//关闭
	close(fd1);
	close(fd2);
	return 0;
}

write.c文件(先发送消息的)

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
int main(int argc, const char *argv[])
{
	//创建打开第一个管道文件
	if(-1==mkfifo("./fifo1",0664)){
		if(17!=errno){
			perror("mkfifo1");
			return -1;
		}
	}
	puts("create pipe1 success");
	//打开管道文件
	int fd1=open("./fifo1",O_WRONLY);
	if(-1==fd1){
		perror("open1");
		return -1;
	}
	puts("open1 success");
	//创建打开第二个管道文件
	if(-1==mkfifo("./fifo2",0664)){
		if(17!=errno){
			perror("mkfifo2");
			return -1;
		}
	}
	puts("create pipe2 success");
	//打开管道文件
	int fd2=open("./fifo2",O_RDONLY);
	if(-1==fd2){
		perror("open2");
		return -1;
	}
	puts("open2 success");
	
	char buf1[128];
	char buf2[128];
	while(1){
		//写
		bzero(buf1,sizeof(buf1));
		//scanf("%s",buf1);
		fgets(buf1,sizeof(buf1),stdin);
		buf1[strlen(buf1)-1]='\0';
		if(strcmp(buf1,"quit")==0)
			break;
		if(-1==write(fd1,buf1,sizeof(buf1))){
			perror("write");
			return -1;
		}
		//读
		bzero(buf2,sizeof(buf2));
		int res=read(fd2,buf2,sizeof(buf2));
		if(res<0){
			perror("read");
			return -1;
		}else if(res==0){
			break;
		}else{
			printf("rose:%s\n",buf2);
			//fprintf(stdout,"rose:%s\n",buf2);
		}
	}

	//关闭
	close(fd1);
	close(fd2);
	return 0;
}

运行结果

2.代码(就是把代码1分别放到线程中就可以了,)

jack.c文件

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
#include <pthread.h>


//线程1:读取
void * fun1(void*arg){
	//创建打开第一个管道文件
	if(-1==mkfifo("./fifo1",0664)){
		if(17!=errno){
			perror("mkfifo1");
			return NULL;
		}
	}
	puts("create pipe1 success");
	//打开管道文件
	int fd1=open("./fifo1",O_WRONLY);
	if(-1==fd1){
		perror("open1");
		return NULL;
	}
	puts("open1 success");
	char buf1[128];
	while(1){

		//写
		bzero(buf1,sizeof(buf1));
		//scanf("%s",buf1);
		fgets(buf1,sizeof(buf1),stdin);
		buf1[strlen(buf1)-1]='\0';
		if(strcmp(buf1,"quit")==0)
			break;
		if(-1==write(fd1,buf1,sizeof(buf1))){
			perror("write");
			return NULL;
		}

	}

	close(fd1);
	pthread_exit(NULL);
}
//线程2:写出
void * fun2(void*arg){
	//创建打开第二个管道文件
	if(-1==mkfifo("./fifo2",0664)){
		if(17!=errno){
			perror("mkfifo2");
			return NULL;
		}
	}
	puts("create pipe2 success");
	//打开管道文件
	int fd2=open("./fifo2",O_RDONLY);
	if(-1==fd2){
		perror("open2");
		return NULL;
	}
	puts("open2 success");

	char buf2[128];
	while(1){

		//读
		bzero(buf2,sizeof(buf2));
		int res=read(fd2,buf2,sizeof(buf2));
		if(res<0){
			perror("read");
			return NULL;
		}else if(res==0){
			break;
		}else{
			printf("rose:%s\n",buf2);
			//fprintf(stdout,"rose:%s\n",buf2);
		}

	}

	close(fd2);
	pthread_exit(NULL);
}
int main(int argc, const char *argv[])
{
	//创建线程
	pthread_t th1,th2;
	if(0!=pthread_create(&th1,NULL,fun1,NULL)){
		puts("th1 create failed");
		return -1;
	}
	if(0!=pthread_create(&th2,NULL,fun2,NULL)){
		puts("th2 create failed");
		return -1;
	}

	pthread_join(th1,NULL);
	pthread_join(th2,NULL);
	return 0;
}

rose文件

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
#include <pthread.h>
//线程1:写出
void * fun1(void* arg){
	//创建打开第一个管道文件
	if(-1==mkfifo("./fifo1",0664)){
		if(17!=errno){
			perror("mkfifo1");
			return NULL;
		}
	}
	puts("create pipe1 success");
	//打开管道文件
	int fd1=open("./fifo1",O_RDONLY);
	if(-1==fd1){
		perror("open1");
		return NULL;
	}
	puts("open1 success");
	char buf1[128];
	while(1){

	//读
		bzero(buf1,sizeof(buf1));
		int res=read(fd1,buf1,sizeof(buf1));
		if(res<0){
			perror("read");
			return NULL;
		}else if(res==0){
			break;
		}else{
			printf("jack:%s\n",buf1);
			//fprintf(stdout,"jack:%s\n",buf1);
		}


	}
	
	close(fd1);
	pthread_exit(NULL);
}
//线程2:读取
void *fun2(void* arg){
	//创建打开第二个管道文件
	if(-1==mkfifo("./fifo2",0664)){
		if(17!=errno){
			perror("mkfifo2");
			return NULL;
		}
	}
	puts("create pipe2 success");
	//打开管道文件
	int fd2=open("./fifo2",O_WRONLY);
	if(-1==fd2){
		perror("open2");
		return NULL;
	}
	puts("open2 success");
	char buf2[128];
	while(1){
			//写
		bzero(buf2,sizeof(buf2));
		//scanf("%s",buf2);
		fgets(buf2,sizeof(buf2),stdin);
		buf2[strlen(buf2)-1]='\0';
		if(strcmp(buf2,"quit")==0)
			break;
		if(-1==write(fd2,buf2,sizeof(buf2))){
			perror("write");
			return NULL;
		}

	}

	close(fd2);
	pthread_exit(NULL);
	
}
int main(int argc, const char *argv[])
{
	//创建线程
	pthread_t th1,th2;
	if(0!=pthread_create(&th1,NULL,fun1,NULL)){
		puts("th1 create failed");
		return -1;
	}
	if(0!=pthread_create(&th2,NULL,fun2,NULL)){
		puts("th2 create failed");
		return -1;
	}

	pthread_join(th1,NULL);
	pthread_join(th2,NULL);
	return 0;
}

运行结果

今日思维导图

to be honest,sometime my brain is shutdown .

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

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

相关文章

org.apache.ibatis.binding.BindingException: Invalid bound statement

在学习黑马头条遇到的关于使用mapper执行方法出现的错误 完整报错信息为&#xff1a;org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.heima.wemedia.mapper.WmNewsMaterialMapper.saveRelations 译为&#xff1a;无效的绑定语句&…

Ubuntu 23.10/24.04 LTS 放弃默认使用 snap 版 CUPS 打印堆栈

导读Canonical 的开发者、OpenPrinting 的项目负责人 Till Kamppeter 今年 5 月表示&#xff0c;计划在 Ubuntu 23.10&#xff08;Mantic Minotaur&#xff09;上默认使用 Snap 版本的 CUPS 打印堆栈。 不过经过数月的测试&#xff0c;官方放弃了这项决定。Ubuntu 23.10&#x…

MySQL面试题——隔离级别相关面试题

隔离级别相关面试题 MySQL事务隔离级别 未提交读——可以读到其他事务未提交的数据&#xff08;最新的版本&#xff09; 错误现象&#xff1a;脏读、不可重复读、幻读的现象 提交读&#xff08;RC&#xff09;——可以读到其他事务已提交的数据&#xff08;最新已提交的版本&…

TypeScript命名空间和模块

&#x1f3ac; 岸边的风&#xff1a;个人主页 &#x1f525; 个人专栏 :《 VUE 》 《 javaScript 》 ⛺️ 生活的理想&#xff0c;就是为了理想的生活 ! 目录 命名空间&#xff08;Namespace&#xff09; 命名空间&#xff08;Namespace&#xff09;使用场景 第三方库 兼容…

蓝桥杯官网填空题(迷宫)

题目描述 本题为填空题&#xff0c;只需要算出结果后&#xff0c;在代码中使用输出语句将所填结果输出即可。 X 星球的一处迷宫游乐场建在某个小山坡上。它是由 1010 相互连通的小房间组成的。 房间的地板上写着一个很大的字母。我们假设玩家是面朝上坡的方向站立&#xff0…

Spring 的创建和日志框架的整合

目录 一、第一个 Spring 项目 1、配置环境 2、Spring 的 jar 包 Maven 项目导入 jar 包和设置国内源的方法&#xff1a; 3、Spring 的配置文件 4、Spring 的核心 API ApplicationContext 4、程序开发 5、细节分析 &#xff08;1&#xff09;名词解释 &#xff08;2&…

LeetCode 362 期周赛

8029.与车相交的点 题目&#xff1a; 给你一个下标从 0 开始的二维整数数组 nums 表示汽车停放在数轴上的坐标。对于任意下标 i&#xff0c;nums[i] [starti, endi] &#xff0c;其中 starti 是第 i 辆车的起点&#xff0c;endi 是第 i 辆车的终点。 返回数轴上被车 任意部…

自动化控制系统的设计重点是什么?

要实现对选择性激光烧结系统预热温度的控制&#xff0c;需要找到合理的控制对象模型&#xff0c;但选择性激光烧结设备的预热温度场是一个复杂的非线性系统&#xff0c;很难找到合理的控制对象模型来实现预热温度场的温度控制。模糊控制不需要具体的控制模型&#xff0c;预热温…

Linux命令200例:dnsconf用于配置和管理域名解析服务

&#x1f3c6;作者简介&#xff0c;黑夜开发者&#xff0c;CSDN领军人物&#xff0c;全栈领域优质创作者✌。CSDN专家博主&#xff0c;阿里云社区专家博主&#xff0c;2023年6月csdn上海赛道top4。 &#x1f3c6;数年电商行业从业经验&#xff0c;历任核心研发工程师&#xff0…

极限的概念与性质

目录 极限的概念 极限的性质 极限的存在准则 极限的概念 极限是数学中的分支——微积分的基础概念&#xff0c;它表示无限趋近于一个固定的数值的过程。在高等数学中&#xff0c;极限可以分为数列极限和函数极限。 1.数列的极限 数列的极限是指对于一个数列{an}中的任意一…

socket编程|TCP

一.套接字概念 套接字&#xff08;Socket&#xff09;是一种用于网络通信的编程接口&#xff0c;它提供了一种机制&#xff0c;使得不同计算机上的应用程序能够通过网络进行通信和交换数据。 套接字可以看作是应用程序和网络之间的端点&#xff0c;它定义了应用程序与网络之间…

400电话:提供全方位客户服务的热线电话

随着现代社会的发展&#xff0c;企业和机构越来越重视客户服务的质量和效率。为了更好地满足客户的需求&#xff0c;提供及时的帮助和解决方案&#xff0c;许多企业纷纷引入了400电话这一全方位客户服务的热线电话。 400电话是一种以4开头的电话号码&#xff0c;通过该号码可以…

[论文阅读]Coordinate Attention for Efficient Mobile Network Design

摘要 最近关于移动网络设计的研究已经证明了通道注意力(例如&#xff0c; the Squeeze-and-Excitation attention)对于提高模型的性能有显著的效果&#xff0c;但它们通常忽略了位置信息&#xff0c;而位置信息对于生成空间选择性注意图非常重要。在本文中&#xff0c;我们提出…

Redis 三种特殊的数据类型 - Geospatial地理位置 - Hyperloglog基数统计的算法 - Bitmaps位图(位存储)

目录 Redis 三种特殊的数据类型&#xff1a; Geospatial&#xff1a;地理位置 Geospatial类型常用的命令&#xff1a; GEOADD&#xff1a;添加地理位置 GEOPOS&#xff1a;获取地理位置 GEODIST&#xff1a;返回两个给定位置之间的距离 GEORADIUS&#xff1a;以给定的经纬…

公司电脑文件加密防泄密软件系统——「天锐绿盾」

天锐绿盾是一款功能强大的公司电脑文件加密防泄密软件系统&#xff0c;旨在保护企业的知识产权和商业机密。 PC访问地址&#xff1a;http://985.so/2y2n9 它具有以下几个主要特点&#xff1a; 文件加密&#xff1a;天锐绿盾会对存储在公司电脑上的所有敏感文件进行自动加密&am…

uniapp——实现电子签名功能——基础积累

话说&#xff0c;2020年刚来杭州的时候&#xff0c;有用到过uniapp&#xff0c;距今已有三年时间了&#xff0c;果然全忘了&#xff0c;哈哈[笑中带泪] 昨天遇到一个需求&#xff1a;就是要实现pdf文件的预览&#xff0c;着实费了我很多的时间&#xff0c;连晚饭都没有吃好。。…

uniapp——实现在线选座功能——技能提升

首先声明一点&#xff1a;下面的内容是从一个uniapp的程序中摘录的&#xff0c;并非本人所写&#xff0c;先做记录&#xff0c;以免后续遇到相似需求抓耳挠腮。 这里写目录标题 效果图代码——html部分cu-custom组件anil-seat组件 代码——jscss部分 效果图 代码——html部分 …

用区熔拉晶法和光谱分析法评价多晶硅棒的规程.

声明 本文是学习GB-T 29057-2023 用区熔拉晶法和光谱分析法评价多晶硅棒的规程. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 12 试验数据处理 12.1 通过测量取得样品的施主、受主杂质和代位碳、间隙氧杂质含量&#xff0c;再按公式(3)计算多晶硅棒…

掌握MyBatis动态SQL:从标签到实战的全面解析

&#x1f600;前言 在我们日常的软件开发中&#xff0c;很多时候都会涉及到与数据库的交互操作。在使用MyBatis框架进行数据库操作时&#xff0c;我们可以利用它提供的一系列XML标签来构建动态SQL语句&#xff0c;以满足不同的业务需求。 . 本文主要探讨了如何使用MyBatis的, ,…

数据结构基础7:二叉树【链式结构】实现和递归思想。

二叉树的链式结构实现 一.二叉树链式结构的实现&#xff1a;1.前置说明&#xff1a;1.创建二叉树&#xff1a;2.二叉树的结构&#xff1a; 2.二叉树的遍历&#xff1a;1.二叉树的前中后序遍历&#xff1a;2.内容拓展&#xff1a; 二.二叉树链式(题目)题目一&#xff1a;计算节点…