IO学习系列之阻塞IO

  • 阻塞IO:
  • 若资源没有准备就绪,会阻塞等待资源;
  • 若资源准备就绪,会获取相关资源;
  • 特点:
  • 在所有的IO模型中,阻塞IO是最简单、最常用、效率最低的;
  • 写阻塞:
  • 如无名管道、有名管道等进程间的通信;
  • 读阻塞:
  • 以管道为例,具体读阻塞操作为:
  • 当进程执行到读操作的时候,若缓冲区有内容,则读取内容继续向下执行,若缓冲区没有内容,进程进入休眠态,直到缓冲区中有内容,由内核唤醒该进程,来读取缓冲区内容,然后继续向下执行;
  • 三个写端:
c 复制代码
	#include <stdio.h>
	#include <string.h>
	#include <stdlib.h>
	#include <unistd.h>
	#include <fcntl.h>
	#include <stdbool.h>
	
	int main(int argc, char const *argv[])
	{
	    int fd = open("myfifo1",O_WRONLY);
	    char buf[128] = {0};
	
	    while(true)
	    {
	        memset(buf,0,sizeof(buf));
	
	        fgets(buf,sizeof(buf),stdin);
	
	        buf[strlen(buf)-1] = '\0';
	
	        write(fd,buf,sizeof(buf));
	    }
	    return 0;
	}
c 复制代码
	#include <stdio.h>
	#include <string.h>
	#include <stdlib.h>
	#include <unistd.h>
	#include <fcntl.h>
	#include <stdbool.h>
	
	int main(int argc, char const *argv[])
	{
	    int fd = open("myfifo2",O_WRONLY);
	    char buf[128] = {0};
	
	    while(true)
	    {
	        memset(buf,0,sizeof(buf));
	
	        fgets(buf,sizeof(buf),stdin);
	
	        buf[strlen(buf)-1] = '\0';
	
	        write(fd,buf,sizeof(buf));
	    }
	    return 0;
	}
c 复制代码
	#include <stdio.h>
	#include <string.h>
	#include <stdlib.h>
	#include <unistd.h>
	#include <fcntl.h>
	#include <stdbool.h>
	
	int main(int argc, char const *argv[])
	{
	    int fd = open("myfifo3",O_WRONLY);
	    char buf[128] = {0};
	
	    while(true)
	    {
	        memset(buf,0,sizeof(buf));
	
	        fgets(buf,sizeof(buf),stdin);
	
	        buf[strlen(buf)-1] = '\0';
	
	        write(fd,buf,sizeof(buf));
	    }
	    return 0;
	}
  • 一个读端:
c 复制代码
	#include <stdio.h>
	#include <string.h>
	#include <stdlib.h>
	#include <unistd.h>
	#include <fcntl.h>
	#include <stdbool.h>
	
	
	int main(int argc, char const *argv[])
	{
	    int fd1 = open("myfifo1",O_RDONLY);
	    int fd2 = open("myfifo2",O_RDONLY);
	    int fd3 = open("myfifo3",O_RDONLY);
	
	    char buf[128] = {0};
	
	    while(true)
	    {
	        memset(buf,0,sizeof(buf));
	        read(fd1,buf,sizeof(buf));
	        printf("myfifo1:%s\n",buf);
	
	        memset(buf,0,sizeof(buf));
	        read(fd2,buf,sizeof(buf));
	        printf("myfifo2:%s\n",buf);
	
	        memset(buf,0,sizeof(buf));
	        read(fd3,buf,sizeof(buf));
	        printf("myfifo3:%s\n",buf);       
	
	    }
	
	    close(fd1);
	    close(fd2);
	    close(fd3);
	    return 0;
	}
  • 运行结果:
c 复制代码
	myfifo1:hello
	myfifo2:world
	myfifo3:hi
	myfifo1:china
	myfifo2:beijing
	myfifo3:the create wall
	myfifo1:i love u
	myfifo2:miss u
	myfifo3:miss u
  • 仅供参考
相关推荐
无奈笑天下6 小时前
银河麒麟上nproc命令教程详解
linux·运维·服务器
I_belong_to_jesus8 小时前
C++关于分支预测的优化1
开发语言·c++·算法
Rabitebla9 小时前
【Linux】进程控制(十二) 自定义 Shell(二):内建命令与进程工作目录管理
linux·c++·笔记·学习·bash
火云代理9 小时前
更换网络后为什么会退出登录?分清 IP、Cookie 与会话的关系
服务器·网络·网络协议·tcp/ip·php·ip
Gary移动存储固件10 小时前
eMMC5.1协议中文学习讲解(6.6.17~6.6.22.4.6)
学习·ufs·emmc·nand·存储固件
威嵌神州10 小时前
嵌入式排故实录:高并发下串口数据“超时丢包”的根因剖析与架构优化
运维·服务器·嵌入式硬件·缓存
一个天蝎座 白勺 程序猿10 小时前
别让收藏夹替你学习:我搭AI知识体系的完整方法,脚本直接拿去用
人工智能·学习·ai·ai学习
楚山之石11 小时前
【Nat Biomed Eng】Connectome 2.0 超高梯度扫描仪:500 mT/m 与 600 T/m/s 把活体人脑微观结构分辨推进到亚微米级
图像处理·学习·数据分析·mri
火云代理13 小时前
同一个网站,有的网络能打开、有的打不开?认识 IPv4 与 IPv6 的访问差异
服务器·网络·网络协议·tcp/ip·测试工具·php·状态模式