第三章 文件IO

  • 对于内核而言,所有打开的文件都通过文件描述符引用,文件描述符是一个非负整数

    文件描述符 标准 符号常量
    文件描述符0 标准输入 STDIN_FILENO
    文件描述符1 标准输出 STDOUT_FILENO
    文件描述符2 标准错误 STDERR_FILENO
  • 函数open和openat---打开文件

    int open(const char *path, int oflag, .../*mode_t mode*/)
    
    int openat(int fd,const char *path, int oflag, .../*mode_t mode*/)
            两函数的返回值:若成功,返回文件描述符,若出错,返回-1
    
    • path---要打开或创建文件的名字
    • oflag---用来说明此函数的多个选项
    • fd---把open和openat函数区分开,有下列三种情况
      1. path参数指定的是绝对路径名,在这种情况下,fd参数被忽略,openat函数相当于open
      2. path参数指定的是相对路径名,fd参数指出了相对路径名在文件系统中的开始地址。fd参数是通过打开相对路径名所在的目录来获取
      3. path参数指定的是相对路径名,fd参数具有特殊值AT_FDCWD。在这种情况下,路径名在当前工作目录中获取,openat函数在操作上和open函数相似
  • 函数creat---创建文件

    int creat(const char *path, mode_t mode)
        返回值:若成功,返回为只写打开的文件描述符。若出错,返回-1
    
  • 函数close---关闭文件

    int close(int fd)
        返回值:若成功,返回0。若出错,返回-1
    
    • 关闭一个文件时会释放该进程加在改文件上的所有记录锁
  • 函数lseek---显示地为一个打开文件设置偏移量

    off_t lseek(int fd, off_t offset, int whence)
        返回值:若成功,返回新的文件偏移量。若出错,返回-1
    

    对参数offset的解释和参数whence的值有关

    • 若whence = SEEK_SET,则将该文件的偏移量设置为距文件开始处offset个字节
    • 若whence = SEEK_CUR,则将该文件的偏移量设置为其当前值加offset,offset可正可负
    • 若whence = SEEK_END,则将该文件的偏移量设置为文件长度加offset,offset可正可负
  • 函数read---读数据

    ssize_t read(int fd, void *buf,size_t nbytes)
        返回值:读到的字节数,若已到文件尾,返回0。若出错,返回-1
    
    • 有多种情况可使实际读到的字节数少于要求读的字节数
  • 函数write---写数据

    ssize_t write(int fd, const void *buf,size_t nbytes)
        返回值:若成功,返回已写的字节数。若出错,返回-1
    
  • 单个进程打开文件时内核数据结构图

image
  • 两个独立进程各自打开了同一个文件,有如下关系图
image
  • 多个进程读取同一文件都能正常工作。每个进程都有它自己的文件表项,其中也有它自己的当前文件偏移量。但是,当多个进程写同一个文件时,则可能产生预想不到的结果

  • 原子操作指的是由多步组成的一个操作,如果原子操作被执行,要么执行完所有步骤,要么一步也不执行,不可能执行所有步骤中的一个子集

  • 函数dup和dup2---复制一个现有的文件描述符

    int dup(int fd)
    
    int dup2(int fd,int fd2);
        返回值:若成功,返回新的文件描述符。若出错,返回-1
    
    • fd---将要复制的文件描述符
    • fd2---指定新描述符的值(将要返回的)
    • dup返回的新文件描述符一定是当前可用文件描述符中的最小数值
    • dup2是一个原子操作,
    close(fd2);
    fcntl(fd,F_DUPFD,fd2);
    
  • 函数fcntl---改变打开已经打开的文件的属性

    int fcntl(int fd, int cmd, .../* int arg */)
        返回值:若成功,则依赖于cmd。若出错,返回-1
    
    • fcntl有以下5中功能
      • 复制一个已有的描述符(cmd = F_DUPFD 或 F_DUPFD_CLOEXEC)
      • 获取/设置文件描述符标志(cmd = F_GETFD 或 F_SETFD)
      • 获取/设置文件状态标志(cmd = F_GETFL 或 F_SETFL)
      • 获取/设置异步I/O所有权(cmd = F_GETOWN 或 F_SETOWN)
      • 获取/设置记录锁(cmd = F_GETLK、F_SETLK 或 F_SETLKW)
    • 在修改文件描述符标志或文件状态标志时必须谨慎,先要获得现在的标志值,然后按照期望修改,最后设置新标志值。不能只执行F_SETFD或F_SETFL命令,这样会关闭以前设置的标志位
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,636评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,890评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,680评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,766评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,665评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,045评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,515评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,182评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,334评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,274评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,319评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,002评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,599评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,675评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,917评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,309评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,885评论 2 341

推荐阅读更多精彩内容

  • 2016-01-29 文件IO 大多数文件io只需要用到5个函数 open read write lseek cl...
    千里山南阅读 577评论 0 0
  • 本文摘抄自linux基础编程 IO概念 Linux的内核将所有外部设备都可以看做一个文件来操作。那么我们对与外部设...
    VD2012阅读 1,017评论 0 2
  • 大纲 一.Socket简介 二.BSD Socket编程准备 1.地址 2.端口 3.网络字节序 4.半相关与全相...
    VD2012阅读 2,247评论 0 5
  • https://nodejs.org/api/documentation.html 工具模块 Assert 测试 ...
    KeKeMars阅读 6,293评论 0 6
  • 1.文件描述符 所有执行I/O操作的系统调用都以文件描述符(一个非负整数)来指代打开的文件。文件描述符用以表示所有...
    666真666阅读 1,066评论 0 2