五种IO模型
直接看图
注:
-
对于低速系统调用(涉及外部设备例如硬盘、键盘等)相对于CPU运行速度来讲属于低速;因此当进程采用低速系统调用时会出现阻塞现象,可能会使进程永远阻塞的调用
常见的例如:scanf函数,如果不输入,进程将永远处于挂起状态。 -
一般的read、write、open函数调用时不阻塞如果操作不能完成则返回
-
阻塞方式和非阻塞方式并不是绝对的;阻塞方式一般采用 两种方式变成非阻塞方式
- 在文件打开时声明:O_NONBLOCK
- 对于已经打开的文件,我们可以采用:fcntl函数来修改文件状态标志从而设置非阻塞方式例如
#include"include.h"
void set_fl(int fd,int flag);
int main(void)
{
char buffer[4096]={
'\0'
};
ssize_t size =0;
set_fl(STDIN_FILENO,O_NONBLOCK);
sleep(3);
size=read(STDIN_FILENO,buffer,sizeof(buffer));
if(size<0)
{
perror("read error");
exit(0);
}
else if(size==0)
{
printf("read finished\n");
}
else
{
if(write(STDOUT_FILENO,buffer,size)!=size)
{
perror("write error");
exit(1);
}
}
return 0;
}
void set_fl(int fd,int flag)
{
//首先获得原来的文件状态标志
int val=fcntl(fd,F_GETFL);
//增加新的文件状态标志
val |=flag;
//重新设置文件状态标志
if(fcntl(fd,F_SETFL,val)<0)
{
perror("fcntl error");
exit(1);
}
}
至于其他的模型后面会一一代码验证。