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
  • 仅供参考
相关推荐
~kiss~7 小时前
MoE的痛点:离散路由
学习
Amazing_Cacao8 小时前
CFCA精品可可工艺师初级校准:暴力破解机器黑盒,实现物理参数与最终风味的精准对齐
笔记·学习
日取其半万世不竭8 小时前
云服务器迁移怎么少停机?DNS 切换前后的完整清单
运维·服务器
alphaTao8 小时前
LeetCode 每日一题 2026/7/6-2026/7/12
算法·leetcode
想吃火锅10058 小时前
【leetcode】56.合并区间js
算法·leetcode·职场和发展
imuliuliang8 小时前
可合并堆在多任务调度中的优势与实现技巧7
算法
学究天人8 小时前
数学公理体系大全:Comprehensive Collection of Mathematical Axiom Systems(卷6)
网络·算法·数学建模·动态规划·几何学·图论·拓扑学
wabs6668 小时前
关于动态规划【力扣72.编辑距离的思考】
算法·leetcode·动态规划
FREEDOM_X8 小时前
Linux 多线程编程——总结
java·linux·运维·ubuntu
浮江雾9 小时前
Flutter第三节----Dart中的数据类型
android·开发语言·学习·flutter·入门·函数