当前位置: 首页 > news >正文

Linux 系统调用详解:操作文件的常用系统调用

文章目录

    • 1.Linux 系统调用详解:操作文件的常用系统调用
      • 1.1 什么是系统调用?
        • 1.2 为什么需要系统调用?
      • 1.3 常见的文件操作系统调用
        • open() — 打开文件
          • 常用标志
          • 权限参数(mode)
        • read() — 读取文件
        • write() — 写入文件
        • close() — 关闭文件
        • lseek() — 定位文件指针
        • ioctl() — 控制设备
      • 总结

1.Linux 系统调用详解:操作文件的常用系统调用

1.1 什么是系统调用?

系统调用是用户程序与操作系统内核之间进行交互的接口。它使得用户程序可以请求操作系统内核为其提供特定的服务,通常涉及到硬件操作、内存管理、文件系统操作等资源的管理。在 Linux 系统中,程序无法直接访问硬件,而是通过系统调用来间接访问,保证了系统的稳定性与安全性。

操作系统将硬件与软件隔离开来,从而避免了程序直接操作硬件的危险。系统调用就是一种用户程序与操作系统之间进行沟通的手段。每当用户程序想要使用操作系统的功能时,它必须通过系统调用进行操作。

1.2 为什么需要系统调用?

操作系统在计算机中扮演着至关重要的角色。它负责对计算机硬件资源的管理和调度。硬件资源包括内存、处理器、磁盘和其他外部设备。而用户程序通常是基于“虚拟化”的方式运行的,无法直接访问硬件。为了安全地访问硬件资源,程序需要向操作系统发出请求,操作系统再根据请求分配资源,这样可以防止程序直接操作硬件或未经授权访问敏感数据。

系统调用作为用户程序与操作系统内核之间的“桥梁”,提供了对文件、设备、内存等系统资源的安全访问途径。通过系统调用,操作系统能保护用户空间与内核空间之间的边界,确保系统的稳定运行。


1.3 常见的文件操作系统调用

在 Linux 系统中,文件的操作是通过系统调用来实现的。文件操作系统调用用于文件的打开、读取、写入、关闭等操作。Linux 操作系统通过这些底层系统调用来提供强大的文件管理功能。下面我们将详细介绍几个常见的文件操作系统调用。

open() — 打开文件

open() 系统调用用于打开一个文件并返回一个文件描述符。文件描述符是一个整数值,它在操作系统内部用于标识和管理文件。通过文件描述符,程序可以进行读取、写入以及其他文件操作。

用法:open(pathname, flags, mode)

pathname:要打开的文件路径。此路径可以是绝对路径,也可以是相对路径。
flags:打开文件的模式。例如,O_RDONLY 表示只读方式,O_WRONLY 表示只写方式,O_RDWR 表示可读可写方式。
mode:指定文件权限。这个参数仅在创建文件时有效,表示文件的访问权限。

open() 函数返回一个文件描述符,用于后续的文件操作。如果打开文件失败,open() 返回 -1,并设置 errno 变量以指示错误类型。

常用标志

O_RDONLY:以只读方式打开文件。
O_WRONLY:以只写方式打开文件。
O_RDWR:以读写方式打开文件。
O_CREAT:如果文件不存在,创建该文件。
O_TRUNC:如果文件存在且以写入方式打开,文件长度将被截为 0。
O_EXCL:与 O_CREAT 一起使用时,如果文件已存在,则返回错误。

权限参数(mode)

S_IRUSR:文件所有者可读。
S_IWUSR:文件所有者可写。
S_IXUSR:文件所有者可执行。
S_IRGRP:文件所属组用户可读。
S_IWGRP:文件所属组用户可写。
S_IXGRP:文件所属组用户可执行。
S_IROTH:其他用户可读。
S_IWOTH:其他用户可写。
S_IXOTH:其他用户可执行。

权限参数通常使用八进制数字来表示。例如,S_IRUSR | S_IWUSR 表示文件所有者可读可写。

read() — 读取文件

read() 系统调用用于从文件中读取数据。它将指定文件描述符指向的文件内容读取到缓冲区中。

用法:read(fd, buffer, count)

fd:文件描述符。
buffer:存储读取数据的缓冲区。
count:最多读取的字节数。

read() 返回实际读取的字节数。如果文件已读到末尾,返回 0;如果发生错误,返回 -1,并设置 errno

read() 调用是阻塞的,这意味着当读取的数据还没有准备好时,调用会被暂停,直到有数据可供读取。

write() — 写入文件

write() 系统调用用于向文件写入数据。它会把程序中的数据从缓冲区写入到文件中。

用法:write(fd, buffer, count)

fd:文件描述符。
buffer:存储要写入数据的缓冲区。
count:要写入的字节数。

write() 返回实际写入的字节数。如果发生错误,返回 -1,并设置 errno

write() 默认是从文件的当前位置开始写入数据。如果文件指针在文件中间,write() 将覆盖当前位置的数据,除非文件是以 O_APPEND 标志打开的。

close() — 关闭文件

close() 系统调用用于关闭一个文件描述符,释放文件资源。每当文件操作完成后,应该调用 close() 来关闭文件,以确保系统资源被正确释放。

用法:close(fd)

fd:文件描述符。

close() 返回 0 表示成功,返回 -1 表示失败。关闭文件后,文件描述符将被释放,可以重新使用。

lseek() — 定位文件指针

lseek() 系统调用用于设置文件描述符的文件偏移量,或者说是修改文件指针的位置。这使得程序可以在文件中任意位置进行读取或写入操作。

用法:lseek(fd, offset, whence)

fd:文件描述符。
offset:文件指针的新位置。
whence:偏移量的起始位置,常用的值有:

 `SEEK_SET`:从文件头开始偏移。`SEEK_CUR`:从当前文件指针位置开始偏移。`SEEK_END`:从文件尾开始偏移。

lseek() 返回新的文件指针位置,如果发生错误,返回 -1,并设置 errno

ioctl() — 控制设备

ioctl() 是一种特殊的系统调用,用于控制设备的 I/O 操作。它在设备驱动程序中起着至关重要的作用,允许程序控制硬件设备的行为。

用法:ioctl(fd, cmd, arg)

fd:设备文件的文件描述符。
cmd:控制命令。
arg:命令的参数,通常是一个指向内存的指针。

ioctl() 的应用非常广泛,它被用来控制硬件设备,如设置串口的波特率,控制磁盘驱动器的读取速度等。


总结

Linux 中的系统调用是用户程序与操作系统内核之间的桥梁,帮助程序安全地访问硬件资源。通过这些系统调用,程序能够以高效且受控制的方式进行文件操作。本文详细介绍了几种常用的文件操作系统调用,包括 open()read()write()close()lseek()ioctl()。掌握这些系统调用的使用方法,可以使您在开发中更加得心应手,快速解决文件管理和设备控制等问题。

http://www.lryc.cn/news/600766.html

相关文章:

  • SSE (Server-Sent Events) 服务出现连接卡在 pending 状态的原因
  • 2025微前端架构研究与实践方案
  • JavaScript里的string
  • 前端设计中如何在鼠标悬浮时同步修改块内样式
  • 【机器学习深度学习】LLamaFactory微调效果与vllm部署效果不一致如何解决
  • k8s的nodeport和ingress
  • 什么是JUC
  • Voxtral Mini:语音转文本工具,支持超长音频,多国语音
  • 9.3 快速傅里叶变换
  • Docker常用命令详解:以Nginx为例
  • gig-gitignore工具实战开发(五):gig add完善
  • 【NLP舆情分析】基于python微博舆情分析可视化系统(flask+pandas+echarts) 视频教程 - 热词评论查询功能实现
  • Spring Boot 单元测试进阶:JUnit5 + Mock测试与切片测试实战及覆盖率报告生成
  • Android ADB命令之内存统计与分析
  • Java学习|黑马笔记|Day23】网络编程、反射、动态代理
  • 深入理解C语言快速排序与自省排序(Introsort)
  • 安卓服务与多线程
  • 学习嵌入式的第三十天-数据结构-(2025.7.21)网络编程
  • 系统性学习C语言-第二十三讲-文件操作
  • 台式电脑有多个风扇开机只有部分转动的原因
  • Matlab自学笔记六十五:解方程的数值解法(代码速成)
  • Nacos-服务注册,服务发现(二)
  • 八股文整理——计算机网络
  • 容器化成本优化:K8s资源请求与限制的黄金法则——从资源画像分析到25%成本削减的实战指南
  • 记录和分享抓取的数字货币和大A时序数据
  • 什么是ICMP报文?有什么用?
  • Matlab学习笔记:自定义函数
  • java基础(day16)set-map
  • DAY24 元组和OS模块
  • 【安全漏洞】网络守门员:深入理解与应用iptables,守护Linux服务器安全