IO模型:
研究的是读写一个文件描述符的几种不同的行为方式,有4中IO模型
(1)阻塞IO
读:如果有数据(即使是小于要读的字节数)直接返回数据
如果没有数据,则阻塞直到有数据或出错
写:如果有空间(即使是小于要写的字节数)直接写
如果没有空间,则阻塞直到有空间或出错
(2)非阻塞IO
读:能读则读,不能读则返回一个错误码
写:能写则写,不能写则返回一个错误码
(3)IO多路复用
允许同时对多个IO进行控制 select/poll/epoll
(4)异步通知(信号驱动IO)
一个可读或可写
1. 如何改变一个文件的读写方式 (阻塞/非阻塞)
(1)open的时候
加上O_NONBLOCK ==》非阻塞
不上O_NONBLOCK ==》阻塞
(2)O_NONBLOCK .... 属于文件的状态信息,在打开文件之后可以改变状态信息
fcntl
fcntl:可以改变已经打开的文件性质
文件状态标志:
O_RDONLY
O_WRONLY
O_RDWR
O_APPEND:标志位移动到文件末端
O_NONBLOCK:非阻塞
O_TRUNC:文件截短
O_ASYNC:异步通知(信号驱动IO)
O_DSYNC :等待写完成(仅数据)
...
fd标志 :目前只有一个
FD_CLOEXEC
NAME
fcntl - manipulate file descriptor
SYNOPSIS
#include <unistd.h>
#include <fcntl.h>
fcntl:用来操作这个文件描述符,具体操作由命令号来指定
int fcntl(int fd, int cmd, ... /* arg */ );
fcntl有五种功能:
(1)复制一个现有的文件描述符(cmd == F_DUPFD)
F_DUPFD:复制文件描述符fd,新的文件描述符作为函数的返回值返回
它是尚未打开的文件描述符中大于或等于第三个参数的值的最小值
eg:
r = fcntl(fd,F_DUPFD,5);
==>r,fd 都指向同一个打开的文件, 且 r >= 5
(2)获取/设置文件描述符标志(cmd == F_GETFD