文件打开

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操作成功。不代表数据已经发送到了接收方,仅仅代表数据已经放入网络缓冲区中。


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


linux最開始仅仅有普通方式,其它的方式一定为了处理各种使用场景而逐渐添加的。

当然不排除某位大牛拍脑袋想出来的。

linux文件打开模式的更多相关文章

  1. C++文件操作(输入输出、格式控制、文件打开模式、测试流状态、二进制读写)

    1.向文件写数据 头文件#include <ofstream> ①Create an instance of ofstream(创建ofstream实例) ②Open the file w ...

  2. C语言中文件打开模式(r/w/a/r+/w+/a+/rb/wb/ab/rb+/wb+/ab+)浅析

    C语言文件打开模式浅析 在C语言的文件操作语法中,打开文件文件有以下12种模式,如下图: 打开模式  只可以读   只可以写  读写兼备 文本模式 r w a r+ w+ a+ 二进制模式 rb wb ...

  3. 关于open函数文件打开模式的有意思的一个现象

    老猿前阵子学习了文件IO,最近正在回顾及进行各种验证和总结,老猿在对文件进行打开后的返回值检查属性时,发现文件打开返回的文件对象的读写模式与打开文件的模式并不完全相同,如下案例: fp1 = open ...

  4. Python——文件打开模式辨析

    版权声明:本文系原创,转载请注明出处及链接. Python中,open()函数打开文件时打开模式如r.r+ .w+.w.a.a+有何不同 r 只能读 r+ 可读可写,不会创建不存在的文件.如果直接写文 ...

  5. c语言文件打开模式

    (转载) 在C语言的文件操作语法中,打开文件文件有以下12种模式,如下图: 打开模式  只可以读   只可以写  读写兼备 文本模式 r w a r+ w+ a+ 二进制模式 rb wb ab  rb ...

  6. fstream文件打开模式

    fstream:对于文件的操作很久两年前就开始使用了,但是仅仅为了达到满足自己需求的目的,就是要么是写,要么是读.从来没有对其进行详细的了解.自己也曾经想过花一点时间去总结一下,这个东西到底应该怎么用 ...

  7. python文件打开模式&time&python第三方库

    r:以只读方式打开文件.文件的指针将会放在文件的开头.这是默认模式. w:打开一个文件只用于写入.如果该文件已存在则将其覆盖.如果该文件不存在,创建新文件. a:打开一个文件用于追加.如果该文件已存在 ...

  8. python中各种文件打开模式

    在python中,总的来说有三种大的模式打开文件,分别是:a, w, r 当以a模式打开时,只能写文件,而且是在文件末尾添加内容. 当以a+模式打开时,可以写文件,也可读文件,可是在读文件的时候,会发 ...

  9. python r r+ w w+ rb 文件打开模式的区别

    # 只读模式with open ( "file.txt" ,'r' ) as f:        for line in f.readlines():                ...

随机推荐

  1. 介绍一个C++奇巧淫技

    你能实现这样一个函数吗:   MyType type;   HisType htype;   serialize_3(11, type, htype);   serialize_4(type, hty ...

  2. Android中特殊图形的生成样例

    import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Color; impor ...

  3. SRM 638 Div2

    2333... 因为TC过少的参与者.加上不断fst 我掉了div2该. 幸运的是完成的背div1该.. 250 水的问题 500 水的问题.. 直接bfs扩展即可了 注意判重.  我还用康托展开了真 ...

  4. php获取分类以下的全部子类方法

    获取分类以下的全部子类方法: static function getMenuTree($arrCat, $parent_id = 0, $level = 0,$all=True) { static $ ...

  5. VC++6.0版本号程序转成VS2010版

    直接转换的时候遇到两个问题: 1.预编译头文件*.PCH找不到 2.static_cast": 无法从"void (__thiscall CView2::* )(void)&quo ...

  6. 网络编程——XML与JSON

    概述 如上篇博客点击打开链接介绍.互联网公司发布Web服务,于是开发者们就可以将其用到自己的应用中.Web服务的工作方式类似于浏览器,输入请求,按下回车,等待远程计算机响应.当响应返回时,浏览器会使用 ...

  7. Hadoop Spark 集群简便安装总结

    本人实际安装经验,目的是为以后高速安装.仅供自己參考. 一.Hadoop 1.操作系统一如既往:①setup关掉防火墙.②vi /etc/sysconfig/selinux,改SELINUX=disa ...

  8. Android中Broadcast Receiver组件具体解释

    BroadcastReceiver(广播接收器)是Android中的四大组件之中的一个. 以下是Android Doc中关于BroadcastReceiver的概述: ①广播接收器是一个专注于接收广播 ...

  9. 简单的java mail发送邮件实例

    mail.jar ,commons-email-X.X.jar ,activation.jar ,log4j.jar  这四个jar,放进项目里 下载地址 http://www.oracle.com/ ...

  10. MYSQL查询一周内的数据(最近7天的)、最近一个月、最近三个月数据

    如果你要严格要求是某一年的,那可以这样 查询一天: select * from table where to_days(column_time) = to_days(now()); select * ...