linux文件打开模式


文件打开
int open(const char * pathname , int  flags , mode_t  mode );

普通方式(Canonical mode)
flags中没有设置O_SYNC and O_DIRECT。这种方式中read是阻塞调用(blocking call),等到磁盘数据读取完毕后返回;write也是阻塞调用,不过write将数据写入到page cache后,就返回,没有写入磁盘的动作。内核会根据一定的策略将page cache中的数据写回到磁盘。

同步模式(Synchronous mode )
设置O_SYNC。read操作和普通方式一样,write操作有所不同。write操作等待数据完全写入磁盘后在返回。该模式下的write操作会有较大的性能降低,但是提高了系统的可靠性,不会产生数据丢失。

Direct I/O mode
设置O_DIRECT 。这种方式下,read和write操作不再经过page cache,而是直接读写磁盘。有些应用程序需要自己维护缓存,可以使用该模式,如数据库系统。
 
非阻塞模式(Nonblocking I/O)
设置O_NONBLOCK。该模式下,read和write都是非阻塞(nonblocking)模式。如果系统中没有可用数据,read立刻返回,而不是等待;write也是如此,如果数据不能马上发送出去,也立刻返回。

该模式一般要结合某种 I/O event notification机制使用,如select, poll, epoll等。

内存映射模式(Memory mapping mode )
通过void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset)打开。

异步模式(Asynchronous mode)
POSIX标准中定义了文件异步访问模式的接口(aio_read,aio_write等)。异步方式中,read/write将要将所需信息(如文件,内存地址等)记录下来,就立刻返回,不需要等待实际IO操作。实际IO完成后,会有事件通知。这个模式和硬件设备的DMA比较类似,只要发出IO指令即可,实际的IO操作会在后面异步完成。

socket的读和写
阻塞模式
recv: 阻塞,直到网络缓冲区中有数据收到。
send:如果网络缓冲区有足够空间,send将数据拷贝到缓冲区后返回;如果没有足够空间(如网络拥塞控制,对方没有确认之前的消息等),阻塞。

非阻塞模式
recv: 如果网络缓冲区中有数据收到,立刻返回。返回值EAGAIN or EWOULDBLOCK。
send : 如果网络缓冲区有足够空间,send将数据拷贝到缓冲区后返回;如果没有足够空间,返回
EAGAIN  or  EWOULDBLOCK 。

send操作成功,不代表数据已经发送到了接收方,只代表数据已经放入网络缓冲区中。

不同的打开方式有不同的适用场景,在选择的时候一定要根据实际需求来确定。如支持高并发的WEB服务器都会选用非阻塞模式处理socket。

linux最开始只有普通方式,其他的方式一定为了处理各种使用场景而逐渐增加的。当然不排除某位大牛拍脑袋想出来的。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值