文件打开

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. 事件总线帧---Otto

    我们如果这样一种业务场景.如今在做一款及时聊天应用,我们在聊天页面进行收发信息.同一时候也要实时更新前一页面的聊天记录,这时我们该怎样去实现?说说我曾经的实现策略.我使用的是广播接收器BroadCas ...

  2. 探索Oracle之数据库升级七 11gR2 to 12c 升级完毕后插入PDB

    探索Oracle之数据库升级七 11gR2 to 12c 升级完毕后插入PDB 前言:        从Oracle 12c開始,引入了容器数据库的概念,能够实现数据库插拔操作,例如以下图: 如今我们 ...

  3. A亚马逊WS网上系列讲座——怎么样AWS云平台上千万用户的应用建设

    用户选择云计算平台构建应用程序的一个重要原因是高弹性的云平台和可扩展性. 面向Internet应用程序通常需要支持用户使用大量,但要建立一个高度可扩展.具有一定的挑战,高度可用的应用程序,只有立足AW ...

  4. cocos2d-x-3.1 事件分发机制 (coco2d-x 学习笔记七)

    触摸事件 Sprite* sp1 = Sprite::create("Images/t1.png"); sp1->setPosition(Vec2(visibleSize.w ...

  5. js快速分享代码

    这是一款简单易用的文章分享工具,您只需将下面的html代码拷贝到模板中就可以实现文章快速分享功能.如果您想分享你的博客.个人网站或者企业网站等等,下面是两款不错的分享工具,值得拥有! 1. <d ...

  6. WebService 通过POST方式访问时候,因 URL 意外地以“/方法名”结束,请求格式无法识别 解决办法

    因URL意外地以“/方法名”结束,请求格式无法识别. 执行当前Web请求期间生成了未处理的异常.可以使用下面的异常堆栈跟踪信息确定有关异常原因和发生位置的信息. 解决方法:在webservice的we ...

  7. 如何收集 EBS 各种相关业务的表的数据

    1. Receiving 相关 參照 Note: 402245.1, 跑 rcv11i_sa.sql 就能够, 输入 po number, 其余默认. 參照 Note: 1294177.1, 假设上面 ...

  8. [Leetcode]-ReverseLinkedList

    题目:单链表取反 #include <stdlib.h> #include <stdio.h> typedef struct node *list; typedef struc ...

  9. 逆向 Framework.jar

    Ref:http://www.addictivetips.com/mobile/what-is-odex-and-deodex-in-android-complete-guide/ Ref:http: ...

  10. 字符串匹配的KMP算法(转)

    字符串匹配是计算机的基本任务之一. 举例来说,有一个字符串"BBC ABCDAB ABCDABCDABDE",我想知道,里面是否包含另一个字符串"ABCDABD" ...