zoukankan      html  css  js  c++  java
  • 沉下心学操作系统(4)关于文件

    title

    [TOC]

    文件描述符

    ​ 每个进程控制块都有一个文件描述符表,可以把它看作一个数组,里面存储指向以打开文件地址的指针,这个数组的下角标就是文件描述符。每次open都会把新打开的文件地址存储到表中的某个空行,并返回下角标作为文件描述符。

    ​ 其中0~2为特殊的文件描述符,分别为标准输入,标准输出,标准错误输出,这三个文件描述符在进程初始时自动打开,其中标准输出就是printf输出的对象

    关于I/O的系统调用函数

    open()

    #include <sys/types.h>
    #include <sys/stat.h>
    #include <fcntl.h>
    int open(const char* pathname, int flags, mode_t mode);

    ​ 相比fopen()处于系统的更低层,可以对文件进行更基础的操作,但是也失去了一些库函数的帮助

    ​ 参数分别是被打开文件路径、进行的操作、创建文件时的使用权限(可省略)

    ​ 它的返回值为文件描述符

    dup2()

    #include <unistd.h>
    int dup2(int oldfd, int newfd);

    ​ 该函数可以使newfd指向oldfd指向的文件

    dup()

    大专栏  沉下心学操作系统(4)关于文件lass="code">
    #include <unistd.h>
    int dup(int oldfd);

    ​ 该函数会选择最小的空闲文件描述符让它指向oldfd,并返回新的指向该文件的描述符

    read()、write()

    #include <unistd.h>
    ssize_t read(int fd, void* buf, size_t count);
    ssize_t write(int fd, const void* buf, size_t count);

    ​ 参数分别为文件描述符,写入/读入的内容,写入/读入的最大长度。若调用成功返回实际读写的长度,否则返回-1

    lseek()

    #include <sys/types.h>
    #include <unistd.h>
    off_t lseek(int fd, off_t offset, int whence);

    ​ 参数分别为文件描述符,移动的长度,移动目标的起点。whence有3个常用值,SEEK_SET,SEEK_END,SEEK_CUR,分别代表开头,结尾和当前位置

    fsync()

    int fsync(int fd);

    ​ 由于向磁盘写入数据很花时间,因此内核为了提高效率会推迟写入数据。而fsync()可以同步内存中所有已修改的文件写入到储存设备

    close()

    int close(int fd);

    ​ 用于关掉文件,fd为文件描述符

  • 相关阅读:
    Effective C++读书笔记~4 设计与声明
    《程序员的自我修养》读书笔记 第十一章 运行库
    C++ 调试问题:对象包含与成员函数不兼容的类型限定符
    Effective C++读书笔记~6 继承与面向对象设计
    C++ lambda表达式
    备战前端
    SQL Server2008 统计某个数据库用户表和行计数方法
    回想
    C# 理解lock
    (原创)Nhibernate对象关系映射的两种方式以及一些注意
  • 原文地址:https://www.cnblogs.com/lijianming180/p/12361029.html
Copyright © 2011-2022 走看看