文件打开

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. ACM-计算几何之Quoit Design——hdu1007 zoj2107

    Quoit Design Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) To ...

  2. s nrmtyu,yi.sfn rt

    http://www.zhihu.com/collection/24337307 http://www.zhihu.com/collection/24337259 http://www.zhihu.c ...

  3. 可重入锁(good)

    可重入锁,也叫做递归锁,是指在一个线程中可以多次获取同一把锁,比如:一个线程在执行一个带锁的方法,该方法中又调用了另一个需要相同锁的方法,则该线程可以直接执行调用的方法[即可重入],而无需重新获得锁: ...

  4. CC Subarray LCM (数学)

    题目连接:http://www.codechef.com/problems/SUBLCM 题意:给定一个序列,求最长连续子序列满足 LCM(Ai,Ai+1...Aj) =Ai*Ai+1*...*Aj. ...

  5. hdu 4925 贪心 自己从小到大做数据找方法规律

    http://acm.hdu.edu.cn/showproblem.php?pid=4925 自己逐个做数据找规律.提供下我的找的: 1 2 1 3 2 2 2 3 3 3 然后发现这种矩阵是最优的: ...

  6. ASPF简介

    ASPF是一种应用层状态检测技术,它通过与NAT和ALG等技术的组合应用,实现对应用层协议状态的处理和检测. 1.1  产生背景 随着计算机技术和网络技术的普及,网络安全问题也越来越得到关注.防火墙作 ...

  7. 定义Java类的数组的问题

    定义了一个类: class Student{ private int Id; public int getId() { return Id; } public void setId(int id) { ...

  8. Java自学资料——线程

    [转]传智播客成都java培训中心学员笔记. 线程: static int MAX_PRIORITY 线程能够具有的最高优先级. static int MIN_PRIORITY 线程能够具有的最低优先 ...

  9. Android网络编程http派/申请服务

    最近的研究Android网络编程知识,这里有一些想法,今晚学习.与您分享. 在实际的应用程序的开发非常需要时间appserver请求数据,那么app怎样发送请求呢?以下的代码就是当中的一种情况.使用H ...

  10. IL来理解属性

    IL来理解属性   阅读目录 概述: C#中如何定义一个属性 Student类 属性Name Main方法 实现get,set方法 性能 访问权限 回到最开始提出的问题 参考资料 .Net底层剖析目录 ...