高级编程学习笔记day01(知识点篇)

文件IO学习笔记
1. 文件描述符:所有打开的文件都通过文件描述符引用.
    文件描述符0与进程的标准输入关联
    文件描述符1与进程的标准输出关联
    文件描述符2与进程的标准错误关联

2. 函数open
    int open(const char *pathname, int flags);
    int open(const char *pathname, int flags, node_t mode);
    node: (1) flags参数用一个或者多个常量进行或运算.
          (2) O_RDONLY 只读打开, O_WRONLY 只写打开, O_RDWR 读,写打开, O_EXEC 只执行打开, O_SEARCH 只搜索打开(应用于目录), 这五个参数必须且只选择一个.
              O_APPEND 追加, O_CREAT 创建等是可选项.

3. 函数close
    int close(int fd);

4. 函数lseek
    off_t lseek(int fd, off_t offset, int whence);
    note: (1) 如果成功返回新的文件偏移量,若失败返回-1
          (2) 当打开一个文件时,除非指定O_APPEND选项,否则偏移量被设置为0.
          (3) 若whence是SEEK_SET, 则将该文件的偏移量设置为距文件开始offset个字节.
              若whence是SEEK_CUR, 则将该文件的偏移量设置为当前值加offset, offset可为正或负.
              若whence是SEEK_END, 则将该文件的偏移量设置为文件长度加offset, offset可正可负.

5. 函数read
    ssize_t read(int fd, void *buf, size_t count);
    note: (1) 成功返回读到的字节数, 若以到文件尾返回0, 出错返回-1.
          (2) 多种情况下可导致实际读到的字节数少于要求读的字节数.例..要求读100字节,但到文件尾端只有30个字节,则返回30.

6. 函数write
    ssize_t write(int fd, void *buf, size_t count);
    note: (1) 成功返回写入的字节数,失败返回-1.

7. 文件共享
    (1) 内核使用三种数据结构表示打开文件: 进程表项, 文件表项, v结点表项
    (2) 每个进程在进程表中都有一个记录项, 记录项包含一张打开的文件描述符, 与每个文件描述符相关联的是文件描述符标志, 和指向一个文件表项的指针.
    (3) 内核为所有打开的文件维持一张文件夹, 每个文件表项包含文件状态标志, 当前文件偏移量和指向该文件v结点表项的指针.
    (4) 每个打开文件(或设备)都有一个v结点结构, 包含文件类型和对此文件进行各种操作函数的指针.

8. 原子操作
    note: (1) 原子操作指的是由多步操作组成的一个操作.要么执行完所有的操作步骤, 要么一步也不执行.
          (2) 追加到一个文件的原子操作:打开文件时设置O_APPEND标志.
           
9. 函数dup(), dup2()
    int dup(int fd);
    int dup2(int fd, int fd2);
    note: (1) 成功返回新的文件描述符, 失败返回-1.
          (2) dup返回的新的文件描述符一定是当前可用文件描述符的最小数值.
          (3) dup2函数可以用fd2参数指定新描述符的值. 如果fd2已经打开, 则先将其关闭. 如果fd等于fd2, 则dup2返回fd2, 而不关闭它. 否则, fd2的FD_CLOEXEC文件描述符标志就被清除, 这样fd2在进程调用exec时打开状态.

10. 函数fcntl
    int fcntl(int fd, int cmd,.../* int arg */);
    note: (1) 复制一个已有的文件描述符(cmd = F_DUPFD, 或F_DUPFD_CLOEXEC)
          (2) 获取/设置文件描述符标志(cmd = F_GETFD or cmd = F_SETFD).
          (3) 获取/设置文件状态标志(cmd = F_GETFL or cmd = F_SETFL).
          (4) 获取/设置异步I/O所有权(cmd = F_GETOWN or cmd = F_SETOWN).
          (5) 获取/设置记录锁(cmd = F_GETLK, F_SETLK or cmd = F_SETLKW).

猜你喜欢

转载自www.cnblogs.com/frank-zhao19/p/10550160.html
今日推荐