同步,异步 ,阻塞,非阻塞
消息的等待方式
阻塞:如果数据没有准备好,就一直等待;反之,立即返回没有数据
消息的通知方式
同步:什么都不做,等待被调用做完后,返回。
异步:根据调用对象的机制,调用者通过状态,通知,回调得到调用的结果 // select, epoll
状态:调用者定时检查
通知,回调:调用者被动得到
同步阻塞
轮询(同步非阻塞).
文件I/O
fcntl 函数可以改变已经打开文件的性质。
F_SETFD 设置文件描述符标志,现在只有F_CLOEXEC
F_SETFL 设置文件状态,O_SYNC 同步写,即马上写到磁盘上,会增加系统时间;
用O_ACCMODE与 来取得文件状态
F_SETOWN 设置接收SIGIO的进程或者进程组
ioctl
盘标号DIO,文件FIO,磁带MTIO,套接SIO,终端TIO
高级I/O
非阻塞IO
如果是调用open以获得该描述符,则可指定O_NONBLOCK标志
对于已经打开的一个描述符,则可调用f c n t l打开O N O N B L O C K文件状态标志
若使用阻塞IO,则有可能另一IO得不到处理。
若使用轮询非阻塞IO,轮询浪费时间,也不知道等多久
记录锁
记录锁(record locking)的功能是:一个进程正在读或修改文件的某个部分时,可以阻止其他进程修改同一文件区。
fcntl(, F_SETLKW, );
struck flock // 锁的类型,锁定范围
F_GETLK 测试所描述的锁是否被另一个进程阻塞(排斥),是,返回另一个进程的锁信息;否,返回,无锁。
F_SETLKW 若想建立的锁被阻塞,则等待,直到收到信号
锁的释放
进程结束,文件被进程关闭时只释放该进程的锁?
fork的子进程不继承父进程的锁
exec可以继承原来的锁
建议性锁和强制性锁
流
用I / O多路转接(I/O multiplexing)。其基本思想是:先构造一张有关描述符的表,然后调用一个函数,
它要到这些描述符中的一个已准备好进行I / O时才返回。在返回时,它告诉进程哪一个描述符已准备好可以进行I / O。
select
int select(关心的最大描述符+1,读,写,异常,等待时间)
在等待的时间内有准备好的,立即返回;若捕捉到信号,EINTR返回-1;否则超时,返回0
关心条件3个都为空时,select可做比sleep更精确的时钟
fd_set rset;
int fd;
FD_ZERO(&rset);
FD_SET(fd, &rset);
if(FD_ISSET(fd, &rset))
如果在一个描述符上碰到了文件结束,则s e l e c t认为该描述符是可读的。然后调用r e a d,它返回0,
int poll(数组,数组个数,时间) ;
struct pollfd // 描述符,关心的事件,发生的事件
异步I / O(asynchronous I/O)。其基本思想是进程告诉内核,当一个描述符已准备好可以进行I / O时,用一个信号通知它。
readv and writev
readv(描述符,数组,个数) // 即读到数组指定的多个缓存中
struct iovec // 缓存开始的地址,长度
散布读,聚集写
readn and writen
网络,终端读写时,可能读的量少于要求读的个数。(磁盘读写没有这个问题)
多次调用读或者写,满足读写N个字符的要求