• APUE 学习笔记(二) 文件I/O


    1. 文件I/O

    对于内核而言,所有打开的文件都通过文件描述符引用,内核不区分文本文件和二进制文件
    open函数:O_RDONLY  O_WRONLY  O_RDWR
    create函数:
    close函数:关闭一个文件时还会释放该进程加在该文件上的所有记录锁
    lseek函数:显式地为一个打开的文件设置其偏移量
    每个打开的文件都有一个与其相关联的 "当前文件偏移量",用以度量从文件开始处计算的字节数,通常,读、写操作都从当前文件偏移量处开始,并使偏移量增加所读写的字节数
    文件偏移量可以大于文件的当前长度,写该文件会在文件中形成一个空洞,文件中的空洞并不要求在磁盘上占用存储区
     
    read函数: 实际读到的字节数少于所要求读的字节数 的情况:
    (1) 读普通文件时,在读要求字节数之前已达到了文件尾端,比如到达文件尾端之前还有30字节,而要求读100字节,那么下一次read会返回30字节,再下一次返回0
    (2) 当从终端设备读时,通常一次最多读一行
    (3) 当从网络套字节读时,网络中的缓冲机制可能造成返回值小于所要求读的字节数
    (4) 当从管道或FIFO读时,例如 管道包含的字节数少于所需的数量,那么read将只返回实际可用的字节数
    (5) 当某一信号造成中断,而已经读了部分数据量时
     
    write函数:其返回值要与所写的字节数相同,否则表示出错
     

    2.文件共享

    内核使用三种数据结构来表示打开的文件
     
    (1)每个进程在进程表中都有一个记录项,包含文件描述符表,有一个文件描述符标志和指向文件表项的指针
    (2)内核为所有打开文件维护一张文件表,包含 文件状态标志、当前文件偏移量、指向该文件V节点表项的指针
    (3)每个打开文件都有一个v节点结构,Linux使用inode节点结构,记录文件的元信息,对应于fstat函数
     
     
    一个给定的文件只有一个v节点表项
    每个进程都有它自己对该文件的当前偏移量
     

    3. dup和dup2函数:复制一个现存的文件描述符

    函数返回的新描述符与输入参数描述符共享同一个文件表项
     

    4.fcntl函数

    fcntl函数可以改变已打开的文件的性质
    int fcntl(int fd, int cmd, ...)
    fcntl函数有5中功能:
    (1)复制一个现有的描述符 (cmd = F_DUPFD)
    (2)获取/设置文件描述符标记 (cmd = F_GETFD, F_SETFD)
    (3)获取/设置文件状态标志 (cmd = F_GETFL, F_SETFL)
    (4)获取/设置异步I/O所有权 (cmd = F_GETOWN, F_SETOWN)
    (5)获取/设置记录锁 (cmd = F_GETLK, F_SETLK, F_SETLKW)
  • 相关阅读:
    LeetCode 43 字符串相乘
    HDU 1031 Design T-Shirt
    HDU 1728 逃离迷宫
    HDU 1285 确定比赛名次
    HDU 1116 Plays on words
    HDU 1195 Open the lock
    HDU 1072 Nightmare
    HDU 1272 小希的迷宫
    HDU 1273 漫步森林
    HDU 1269 迷宫城堡
  • 原文地址:https://www.cnblogs.com/wwwjieo0/p/3709967.html
Copyright © 2020-2023  润新知