文件打开

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. 算法起步之Prim算法

    原文:算法起步之Prim算法 prim算法是另一种最小生成树算法.他的安全边选择策略跟kruskal略微不同,这点我们可以通过一张图先来了解一下. prim算法的安全边是从与当前生成树相连接的边中选择 ...

  2. Json for Java API学习

    首先声明:本文来个非常多网友的博客,我通过參考了他们的博客,大致的了解了一些项目中经常使用的Json in java 类和方法,以及关于json的个人理解 个人对json的一些简单理解 在近期的学习中 ...

  3. 在Activity中为什么要用managedQuery()

    刚開始接触android的时候,每次用数据库都会犹豫使用哪种方式,一种是getContentResolver().query(...),还有一种是managedQuery(...),后来习惯了使用前一 ...

  4. Linux中下载,压缩,解压等命令

    查看是否和还有一台Linux机器相通命令:ssh    主机名@Ip地址    ,提示输入password.就可以查看远程文件的文件夹 下载远程机器上的文件:scp  主机名@Ip地址:/path/s ...

  5. SimpleDateFormat 的线程安全问题与解决方式

    SimpleDateFormat 的线程安全问题 SimpleDateFormat 是一个以国别敏感的方式格式化和分析数据的详细类. 它同意格式化 (date -> text).语法分析 (te ...

  6. PostgreSQL服务端监听设置及client连接方法

    背景介绍: PostgreSQL服务端执行在RedHat Linux上,IP为:192.168.230.128 client安装在Windows XP上, IP为:192.168.230.1 配置方法 ...

  7. [置顶] hdu 4699 2个栈维护 or 伸展树

    hdu 4699  Editor 题意:对一个数列进行操作,光标位置后面插入一个权值为x的数,删除光标前的那个数,光标左移一位,光标右移一位,求到k位置的最大的前缀和.. 注意这里的k是在光标之前的, ...

  8. [Oracle] - 性能优化工具(4) - AWRDD

    AWRDD是用于比較两个AWR快照,从而获得不同一时候期的性能. 运行例如以下语句获得AWRDD: @?/rdbms/admin/awrddrpt.sql 2025 23 2月 2014 07:12 ...

  9. java枚举的使用

    定义枚举 public enum YesOrNo { YES("是") , NO("否") ; private String text ; private in ...

  10. Quartz时间配置

    格式: [秒] [分] [小时] [日] [月] [周] [年]  序号 说明  是否必填  允许填写的值 允许的通配符  1  秒  是  0-59    , - * /  2  分  是  0-5 ...