高级io:io的特殊表现有非阻塞io,文件锁,io多路转接,存储映射等
非阻塞io:在原来的io操作中,默认是阻塞io,即当读空文件时,read阻塞,在read阻塞期间,如果被信号打断了,errno会设置为EINTR,这种错误也叫假错;写满文件时,write阻塞,这种现象就是io阻塞。
阻塞io:read读空管道不会阻塞,会返回错误值-1,errno会设置为EAGAIN,这种错误称为假错;write读满管道时不会阻塞,会返回错误值。
如何将文件设置为非阻塞:
未打开的文件,open时加上选项O_NONBLOCK;
打开的文件,使用fctnl将文件设置为非阻塞;
old_f = fcntl(fd, F_GETFL);
fcntl(fd, F_SETFL, old_f | O_NONBLOCK);
捕获异步时间的两种方法:
轮询:暂且轮询。
通知:(监听文件是否可读可写的机制)-->io多路转接
有限状态机:将要处理的时间抽象出有限状态,找到状态之间的切换关系。
优点:程序更加健壮,如果有功能增加,无非就是增加几个状态,原来的状态是不需要改变的,改变的是多了几条切换的语句,本质上就是多了几个case。
select(int nfds, fd_set *rfds, fd_set *wfds, fd_set *efds, struct timeval *timeout)
监听rfds,wfds,efds是否发生了ready事件。
ready
rfds集中的文件空间有数据可读
wfds集中有空间可写
efds集中有异常发生了
nfds是三个集合中最大的文件描述符+1;
timeout如果是NULL,永久阻塞到ready,不是NULL,代表最大超时时间。
返回值
变成ready的文件描述符的个数。