一文详解Linux系统下文件操作相关的系统调用

 更新时间:2025年11月04日 09:27:10   作者:郝学胜-神的一滴  
在Linux系统中,文件操作是程序开发中不可或缺的一部分,Linux提供了丰富的系统调用来实现文件的读写、打开、关闭以及控制等功能,本文将详细阐述Linux系统中文件操作相关的系统调用,需要的朋友可以参考下

前言

在Linux系统中,文件操作是程序开发中不可或缺的一部分。Linux提供了丰富的系统调用来实现文件的读写、打开、关闭以及控制等功能。本文将详细阐述Linux系统中文件操作相关的系统调用,包括文件描述符、openclose函数、errnoperrorreadwrite操作、阻塞与非阻塞文件操作,以及fcntl函数的使用。

1. 文件描述符

文件描述符是Linux系统中用于标识打开文件或设备的整数。它是用户空间程序与内核之间通信的桥梁,所有文件操作均基于文件描述符进行。常见的文件描述符包括标准输入(0)、标准输出(1)和标准错误(2)。

1.1 文件描述符的作用

文件描述符的主要作用是将用户空间的文件操作请求传递给内核,内核处理后将结果返回给用户空间程序。例如,当调用open系统调用时,内核会返回一个文件描述符,用于后续的读写操作。

1.2 示例代码

#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>

int main() {
    int fd = open("example.txt", O_RDONLY);
    if (fd == -1) {
        perror("open");
        exit(EXIT_FAILURE);
    }
    close(fd);
    return 0;
}

2. open函数与close函数

2.1 open函数

open函数用于打开一个文件或设备,并返回一个文件描述符。其函数原型如下:

int open(const char *pathname, int flags);
  • pathname:要打开的文件或设备的路径名。
  • flags:打开文件的模式,常用的模式包括:
    • O_RDONLY:只读模式。
    • O_WRONLY:只写模式。
    • O_RDWR:读写模式。
    • O_CREAT:如果文件不存在,则创建文件。
    • O_TRUNC:如果文件存在,则清空文件内容。

open函数返回一个文件描述符,如果失败则返回-1,并设置errno

2.2 close函数

close函数用于关闭一个文件描述符,释放与该文件相关的资源。其函数原型如下:

int close(int fd);
  • fd:要关闭的文件描述符。

close函数返回0表示成功,如果失败则返回-1,并设置errno

2.3 示例代码

#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>

int main() {
    int fd = open("example.txt", O_WRONLY | O_CREAT, 0644);
    if (fd == -1) {
        perror("open");
        exit(EXIT_FAILURE);
    }
    close(fd);
    return 0;
}

3. errno与perror

在Linux系统中,errno是一个全局变量,用于存储最后一次系统调用产生的错误代码。perror函数可以将errno的值转换为一个有意义的错误信息字符串,并将其打印到标准错误输出。

示例代码

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <fcntl.h>

int main() {
    int fd = open("nonexistentfile.txt", O_RDONLY);
    if (fd == -1) {
        perror("open");
        exit(EXIT_FAILURE);
    }
    close(fd);
    return 0;
}

4. read与write操作文件

4.1 read函数

read函数用于从文件描述符对应的文件中读取数据。其函数原型如下:

ssize_t read(int fd, void *buf, size_t count);
  • fd:文件描述符。
  • buf:存储读取数据的缓冲区。
  • count:要读取的字节数。

read函数返回实际读取的字节数,如果返回0表示已到达文件末尾,如果返回-1表示读取失败,并设置errno

4.2 write函数

write函数用于向文件描述符对应的文件中写入数据。其函数原型如下:

ssize_t write(int fd, const void *buf, size_t count);
  • fd:文件描述符。
  • buf:要写入的数据缓冲区。
  • count:要写入的字节数。

write函数返回实际写入的字节数,如果返回-1表示写入失败,并设置errno

4.3 示例代码

#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>

int main() {
    int fd = open("example.txt", O_WRONLY | O_CREAT, 0644);
    if (fd == -1) {
        perror("open");
        exit(EXIT_FAILURE);
    }

    const char *message = "Hello, Linux!";
    ssize_t bytes_written = write(fd, message, strlen(message));
    if (bytes_written == -1) {
        perror("write");
        exit(EXIT_FAILURE);
    }

    close(fd);
    return 0;
}

5. 阻塞与非阻塞的文件操作

Linux系统中的文件操作默认是阻塞的,即当调用readwrite时,程序会一直等待直到操作完成。对于某些应用场景,如网络通信或实时系统,阻塞操作可能会导致程序响应变慢。

为了实现非阻塞操作,可以使用fcntl函数将文件描述符设置为非阻塞模式。非阻塞模式下,如果readwrite无法立即完成,函数会返回-1,并设置errnoEAGAINEWOULDBLOCK

6. fcntl函数

fcntl函数用于控制文件描述符的各种属性,例如设置文件描述符为非阻塞模式。其函数原型如下:

int fcntl(int fd, int cmd, ...);
  • fd:文件描述符。
  • cmd:命令,常用的命令包括:
    • F_GETFD:获取文件描述符的标志。
    • F_SETFD:设置文件描述符的标志。
    • F_GETFL:获取文件描述符的访问模式。
    • F_SETFL:设置文件描述符的访问模式。

6.1 示例代码:将文件描述符设置为非阻塞模式

#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>

int main() {
    int fd = open("example.txt", O_WRONLY | O_CREAT, 0644);
    if (fd == -1) {
        perror("open");
        exit(EXIT_FAILURE);
    }

    int flags = fcntl(fd, F_GETFL, 0);
    if (flags == -1) {
        perror("fcntl");
        exit(EXIT_FAILURE);
    }

    flags |= O_NONBLOCK;
    if (fcntl(fd, F_SETFL, flags) == -1) {
        perror("fcntl");
        exit(EXIT_FAILURE);
    }

    close(fd);
    return 0;
}

总结

Linux系统提供了丰富的文件操作系统调用,这些调用是程序开发中不可或缺的一部分。通过合理使用open、close、read、write、fcntl等系统调用,可以实现高效、可靠的文件操作。同时,errno和perror函数可以帮助开发者快速定位和解决错误。

希望本文能够帮助开发者更好地理解和使用Linux系统中的文件操作系统调用,提升程序的性能和可靠性。

以上就是一文详解Linux系统下文件操作相关的系统调用的详细内容,更多关于Linux文件操作系统调用的资料请关注脚本之家其它相关文章!

相关文章

  • linux输入yum后提示: -bash: /usr/bin/yum: No such file or directory的解决方法

    linux输入yum后提示: -bash: /usr/bin/yum: No such file or director

    在本篇文章里小编给大家整理的是关于linux输入yum后提示: -bash: /usr/bin/yum: No such file or directory的解决方法,有需要的朋友们参考下。
    2019-11-11
  • linux时间同步实现方案

    linux时间同步实现方案

    Linux时间同步方案对比与选择,重点推荐chrony;适用于现代Linux系统与资源受限环境;同时介绍ntpd与ntpdate的适用场景与配置迁移建议;帮助读者选择最适合的时间同步工具
    2026-05-05
  • Linux的netstat命令详解

    Linux的netstat命令详解

    这篇文章主要介绍了Linux的netstat命令,netstat命令用于显示与IP、TCP、UDP和ICMP协议相关的统计数据,它能提供TCP连接,TCP和UDP监听,进程内存管理的相关报告。需要的朋友可以参考下面文章内容
    2021-09-09
  • Ubuntu环境安装Anaconda3完整步骤

    Ubuntu环境安装Anaconda3完整步骤

    大家好,本篇文章主要讲的是Ubuntu环境安装Anaconda3完整步骤,感兴趣的同学快来看一看吧,对你有帮助的话记得收藏一下哦
    2021-11-11
  • linux高性能测试之CPU模式批量由cpupower转performance问题

    linux高性能测试之CPU模式批量由cpupower转performance问题

    这篇文章主要介绍了linux高性能测试之CPU模式批量由cpupower转performance问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-06-06
  • Linux命令之文件分割split命令方式

    Linux命令之文件分割split命令方式

    这篇文章主要介绍了Linux命令之文件分割split命令方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-04-04
  • 快速解决linux下中文输入法问题

    快速解决linux下中文输入法问题

    这篇文章主要介绍了linux下中文输入法问题及解决方案,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-07-07
  • apache简介_动力节点Java学院整理

    apache简介_动力节点Java学院整理

    本篇文章主要介绍apache简介,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-08-08
  • linux防火墙iptables规则的查看、添加、删除和修改方法总结

    linux防火墙iptables规则的查看、添加、删除和修改方法总结

    本文介绍了如何对linux防火墙iptables规则进行查看、添加、删除和修改的操作,大家可以参考一下
    2018-03-03
  • 浅析Linux中的零拷贝技术的使用

    浅析Linux中的零拷贝技术的使用

    这篇文章主要介绍了浅析Linux中的零拷贝技术的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07

最新评论