高级 IO

我认识的IO :读进来,写进行。

读写前可能得等待事件的就绪

五种IO模型

阻塞IO:系统调用会一直等待数据的到来,然后拷贝。
非阻塞IO:若文件描述符未就绪,系统调用不会等待,只是来判断一下,然后返回EWOULDBLOCK错误码.。若已经就绪,就直接拷贝,返回。需要调用者轮询使用。
信号驱动IO:用户不会阻塞的等待数据的到来,而是注册一个信号处理,等到信号触发时再阻塞的到内核拷贝数据。
异步IO:完全将等待和拷贝交给了其他执行流做,此执行只在数据拷贝结束后通知调用者。
多路转接IO:阻塞的等待多个文件描述符的就绪,就绪之后对数据进行拷贝。

同步/异步

文件描述符默认属性是阻塞的。

同步:调用者清楚执行者什么时候产生结果。
异步:调用者不清楚执行者什么时候产生结果,是随机的。

fcntl()函数

#include 
#include 
int fcntl(int fd, int cmd, ... /* arg */ );
传入的cmd的值不同, 后面追加的参数也不相同.
fcntl函数有5种功能:
复制一个现有的描述符(cmd=F_DUPFD).
获得/设置文件描述符标记(cmd=F_GETFD或F_SETFD).
获得/设置文件状态标记(cmd=F_GETFL或F_SETFL).
获得/设置异步I/O所有权(cmd=F_GETOWN或F_SETOWN).
获得/设置记录锁(cmd=F_GETLK,F_SETLK或F_SETLKW).

设置非阻塞属性

int flag = fcntl(fd,F_GETFL);
fcntl(fd,flag|O_NONBLOCK);

你可能感兴趣的:(linux)