博客
关于我
Linux第八次学习笔记
阅读量:796 次
发布时间:2023-02-05

本文共 1615 字,大约阅读时间需要 5 分钟。

系统级I/O与Unix文件操作

在计算机系统中,输入/输出(I/O)操作是主存与外部设备之间数据传输的关键环节。本文将深入探讨Unix系统下的文件操作机制,包括文件的打开、读写、关闭等方面的细节。

Unix I/O模型

Unix系统将所有的I/O设备抽象为文件,这使得文件操作与设备操作具有一致性。程序通过读写文件进行I/O操作,而内核负责将操作转化为实际的设备访问。

文件操作的三个基本步骤

  • 打开文件

    应用程序通过调用open()函数,通知内核希望访问哪个文件。内核返回文件描述符(file descriptor),并记录文件的相关信息。每个进程开始时,通常会打开三个文件:

    • 标准输入(STDIN_FILENO):描述符为0
    • 标准输出(STDOUT_FILENO):描述符为1
    • 标准错误(STDERR_FILENO):描述符为2
  • 定位文件

    文件的当前位置由lseek()函数控制。内核维护一个偏移量k,表示从文件开头开始的字节偏移。通过seek()操作,可以将k设定为任意值。

  • 读写文件

    • 读操作:从文件中读取数据到存储器。read()函数返回实际读取的字节数,可能小于请求的n,如文件末尾或网络缓存等原因。
    • 写操作:将存储器中的数据写入文件。write()函数返回实际写入的字节数,可能因存储空间不足或文件权限原因而受限。
  • 关闭文件

    在文件操作完成后,必须通过close()函数释放文件资源。内核会回收描述符表和文件表,并释放与文件相关的内存。

  • 文件操作函数

    open()函数

    open()函数的调用格式为:

    int open(const char *filename, int flags, mode_t mode);

    参数说明:

    • filename:文件路径字符串。
    • flags:操作模式旗标,支持多种组合:
      • O_RDONLY:只读模式。
      • O_WRONLY:只写模式。
      • O_RDWR:读写模式。
      • O_CREAT:创建新文件。
      • O_TRUNC:截断现有文件。
      • O_APPEND:追加模式。
    • mode_t mode:文件权限标志,支持9种掩码位组合。可以用umask函数设置默认权限。

    返回值:成功返回文件描述符,失败返回-1。

    close()函数

    close()函数用于关闭文件描述符:

    int close(int fd);

    参数说明fd是要关闭的文件描述符。

    返回值:成功返回0,失败返回-1。

    read()write()函数

    • read()函数
    ssize_t read(int fd, void *buf, size_t n);

    从文件中读取n字节到buf缓冲区。返回实际读取的字节数,或-1表示失败。

    • write()函数
    ssize_t write(int fd, const void *buf, size_t n);

    n字节从buf缓冲区写入文件。返回实际写入的字节数,或-1表示失败。

    优化文件读写性能

    为了提升文件操作性能,可以使用rio(Robust I/O)库。rio提供两种无缓冲函数和带缓冲函数,适用于不同场景:

    rio_readn()rio_writen()函数

    无缓冲函数适用于网络传输或高效读写,直接传输数据。

    rio_readlineb()rio_readnb()函数

    带缓冲函数用于处理文本和二进制数据,支持行读写和大块读写。

    文件元数据查询

    通过stat()fstat()函数,可以检索文件的元数据,如文件大小、权限、所有者、修改时间等。这些信息存储在struct stat结构体中。

    共享文件与I/O重定向

    在Unix系统中,文件共享通过文件表实现。内核用描述符表和v-node表管理文件资源。dup2()函数用于将描述符重定向到另一个描述符。

    总结

    本文从基础的文件操作到高级的I/O优化,全面探讨了Unix系统下的文件操作机制。理解这些机制是掌握Linux系统编程的关键。

    转载地址:http://xtkfk.baihongyu.com/

    你可能感兴趣的文章
    linux服务器大量TIME_WAIT状态问题
    查看>>
    linux服务器如何配置qq邮箱,linux用mail往qq邮箱发邮件
    查看>>
    Linux服务器存储共享操作
    查看>>
    Linux服务器存在大量log日志,如何快速定位错误?(非常详细)零基础入门到精通,收藏这一篇就够了
    查看>>
    Linux服务器安装Nginx
    查看>>
    Linux服务器性能测试_Linux服务器网速测试
    查看>>
    Linux服务器性能监控利器 —— Nmon实战
    查看>>
    Linux服务器搭建DNS服务:深入解析与实战配置!------文章最后有福利哦,快来领取。...
    查看>>
    linux服务器用户管理
    查看>>
    Linux服务器登陆安全设置,并使用ssh keys登陆
    查看>>
    Linux服务器的关机或者重启你一般会怎么操作?今天介绍5种办法,最后一种可以成救命草!
    查看>>
    linux服务器的常规操作命令,Apache服务器常规操作
    查看>>
    Linux服务器的稳定性优势有哪些
    查看>>
    linux服务器的稳定性优势有哪些
    查看>>
    linux服务器监听服务sid_linux下重启oracle服务:监听器和实例
    查看>>
    linux服务器负载分析
    查看>>
    Linux服务器运行命令df -h无响应
    查看>>
    Linux服务器还有漏洞?建议使用 OpenVAS 日常检查!
    查看>>
    Linux服务器那么多参数该如何监控,掌握这些Linux监控命令可以早点下班!
    查看>>
    Linux服务器配置DNS解析(非常详细)零基础入门到精通,收藏这篇就够了
    查看>>