文件IO常用函数

简介: 文件IO常用函数

在LINUX下,有着 一切皆文件的定义,所谓文件IO就是指文件的 输入和 输出。

文件类型

  1. 普通文件(-)
    如mp4、 pdf、 html log;用户可以根据访问权限对普通文件进行查看、更改和删除,包括 纯文本文件(ASCII)
    ;二进制文件(binary);数据格式的文件(data);各种压缩文件.第一个属性为 [-]
  2. 目录文件(d)
    /usr/ /home/目录文件包含了各自目录下的文件名和指向这些文件的指针,打开目录事实上就是打开目录文件,只要有访问权限,就可以随意访问这些目录下的文件。能用#cd命令进入的。第一个属性为[d],例如 [drwxrwxrwx]
  3. 硬链接 (-)
    若一个 硬链接的局限性 inode号对应多个文件名,则称这些文件为硬链接。硬链接就是同一个文件使用了多个别名删除时 :1.不能引用自身文件系统以外的文件,即不能引用其他分区的文件;2.无法引用目录; ,只会删除链接, 不会删除文件;
  4. 符号链接(软链接) (l)
    若文件用户数据块中存放的内容是另一文件的路径名的指向,则该文件就是软连接,克服硬链接的局限性, 类似于快捷方式,使用与硬链接相同。
  5. 字符设备文件 ©
    文件一般隐藏在/dev目录下,在进行设备读取和外设交互时会被使用到即串行端口的接口设备,例如键盘、鼠标等等。第一个属性为 [c]。#/dev/tty的属性是 crw-rw-rw-,注意前面第一个字 c,这表示字符设备文件
  6. 块设备文件 (b)
    存储数据以供系统存取的接口设备,简单而言就是硬盘。# /dev/hda1 的属性是 brw-r—– ,注意前面的第一个字符是b,这表示块设备,比如硬盘,光驱等设备系统中的所有设备要么是块设备文件,要么是字符设备文件,无一例外
  7. FIFO管道文件 §
    管道文件主要用于进程间通讯。 FIFO解决多个程序同时存取一个文件所造成的错误。比如使用mkfifo命令可以创建一个FIFO文件,启用一个进程A从FIFO文件里读数据,启动进程B往FIFO里写数据,先进先出,随写随读。# pipe
  8. 套接字(S)
    以启动一个程序来监听客户端的要求,客户端就可以通过套接字来进行数据通信。用于进程间的网络通信,也可以用于本机之间的非网络通信, 第一个属性为 [s],这些文件一般隐藏在/var/run目录下,证明着相关进程的存在

man手册

man [选项] [命令/函数/系统调用]

下面是常用的选项及其含义:

  • -f:查找所有与指定关键字匹配的命令、函数或系统调用;
  • -k:查找所有与指定关键字匹配的命令、函数或系统调用的简介;
  • -a:显示所有匹配的手册页;
  • -M:指定手册搜索路径;
  • -p:显示匹配关键字的所在段落。

1 - commands(普通的命令)

2 - system calls(系统调用)

3 - library calls(库函数)

4 - special files(特殊文件: /dev 下设备文件)

5 - file formats and convertions(文件格式

6 - games for linux(游戏和娱乐)

7 - macro packages and conventions(杂项)

8 - system management commands(管理员命令)

9 - 其他(Linux 特定, 用来存放内核例行程序的文档)

1
   可执行程序或 shell 命令
   2
   系统调用(内核提供的函数)
   3
   库调用(程序库中的函数)
   4
   特殊文件(通常位于 /dev)
   5
   文件格式和规范,如 /etc/passwd
   6
   游戏
   7
   杂项(包括宏包和规范,如 man(7),groff(7))
   8
   系统管理命令(通常只针对 root 用户)
   9
   内核例程 [非标准

概述

man  [-C  文件]  [-d]  [-D] [--warnings[=警告]] [-R 编码] [-L 区域] [-m
系统[,...]] [-M 路径] [-S 列表] [-e 扩展] [-i|-I]  [--regex|--wildcard]
[--names-only]  [-a]  [-u] [--no-subpages] [-P 分页程序] [-r 提示] [-7]
[-E 编码]  [--no-hyphenation]  [--no-justification]  [-p  字符串]  [-t]
[-T[设备]] [-H[浏览器]] [-X[dpi]] [-Z] [[章节] 页 ...] ...
man -k [apropos 选项] 正则表达式 ...
man -K [-w|-W] [-S list] [-i|-I] [--regex] [章节] 词语 ...
man -f [whatis 选项] 页 ...
man  -l [-C 文件] [-d] [-D] [--warnings[=警告]] [-R 编码] [-L 区域] [-P
分页程序]  [-r  提示]  [-7]  [-E  编码]  [-p  字符串]  [-t]  [-T[设备]]
[-H[浏览器]] [-X[dpi]] [-Z] 文件 ...
man -w|-W [-C 文件] [-d] [-D] 页 ...
man -c [-C 文件] [-d] [-D] 页 ...
man [-?V]

open()

#include <sys/stat.h>

#include <fcntl.h>

int open(const char *path, int oflag, …);

int openat(int fd, const char *path, int oflag, …);

  • open() 调用成功返回文件描述符,失败返回-1,并设置errno。
  • open调用返回的文件描述符一定是最小的未用描述符数字。
  • open()可以打开设备文件,但是不能创建设备文件,设备文件必须使用mknod()创建。

参数

  • pathname被打开的文件名(可包括路径名) 。
  • flags
  • O_RDONLY:只读方式打开文件。这三个参数互斥
  • O_WRONLY:可写方式打开文件。
  • O_RDWR:读写方式打开文件。
  • O_CREAT:如果该文件不存在,就创建一个新的文件,并用第三的参数为其设置权限。
  • O_EXCL:如果使用O_CREAT时文件存在,则可返回错误消息。这一参数可测试文件是否存在。
  • O_NOCTTY:使用本参数时,如文件为终端,那么终端不可以作为调用open()系统调用的那个进程的控制终端。
  • O_TRUNC:如文件已经存在,那么打开文件时先删除文件中原有数据。
  • O_APPEND:以添加方式打开文件,所以对文件的写操作都在文件的末尾进行。
  • mode 被打开文件的存取权限,为8进制表示法。

close()

#include <unistd.h>

int close(int fildes);

调用成功返回0,出错返回-1,并设置errno。

当一个进程终止时,该进程打开的所有文件都由内核自动关闭。

关闭一个文件的同时,也释放该进程加在该文件上的所有记录锁。

# read()
      #include <unistd.h>
       ssize_t pread(int fildes, void *buf, size_t nbyte, off_t offset);
       ssize_t read(int fildes, void *buf, size_t nbyte);

调用read()函数可以从一个已打开的可读文件中读取数据

读操作从文件的当前位移量处开始,在成功返回之前,该位移量增加实际读取的字节数。

fd:文件描述符

buf:参数需要由调用者来分配内存,并在使用后,由调用者释放分配的内存。

Count:表示缓冲区大小,一次最多读取count个数据。

read()调用成功返回读取的字节数,如果返回0,表示到达文件末尾,如果返回-1,表示出错,通过errno设置错误码。

write()

#include <unistd.h>

ssize_t pwrite(int fildes, const void *buf, size_t nbyte,

off_t offset);

ssize_t write(int fildes, const void *buf, size_t nbyte);

调用write()函数可以向一个已打开的可写文件中写入数据。

对于普通文件,写操作从文件的当前位移量处开始,如果在打开文件时,指定了O_APPEND参数,则每次写操作前,将文件位移量设置在文件的当前结尾处,在一次成功的写操作后,该文件的位移量增加实际写的字节数。

write()调用成功返回已写的字节数,失败返回-1,并设置errno。

write()的返回值通常与count不同,因此需要循环将全部待写的数据全部写入文件。

write()出错的常见原因:磁盘已满或者超过了一个给定进程的文件长度限制。

ioctl()

ioctl()函数是Linux中用于设备IO控制的通用函数,可以用于向设备发送控制命令,或者从设备读取控制信息。它通常用于驱动程序中,而不是在应用程序中使用。

int ioctl(int fd, unsigned long request, ...);

参数说明:

  • fd:文件描述符。
  • request:控制命令的编号,通常使用宏定义来表示。
  • …:可选的参数,通常是一个指向数据的指针,用于传递控制信息或获取设备状态信息

ioctl()函数的参数类型和含义根据控制命令的不同而有所不同,常见的控制命令包括:

  • FIONREAD:获取输入缓冲区中的可读字节数,需要传递一个指向 int 类型变量的指针作为 ioctl() 函数的第三个参数。
  • FIONBIO:设置非阻塞IO模式,需要传递一个指向 int 类型变量的指针作为 ioctl() 函数的第三个参数,将该变量设置为1表示开启非阻塞模式,设置为0表示关闭非阻塞模式。
  • FIOASYNC:设置异步IO模式,需要传递一个指向 int 类型变量的指针作为 ioctl() 函数的第三个参数,将该变量设置为1表示开启异步IO模式,设置为0表示关闭异步IO模式。
  • FIOSETOWN 和 FIOGETOWN:设置或获取文件描述符的拥有者进程,需要传递一个指向 pid_t 类型变量的指针作为 ioctl() 函数的第三个参数,分别表示设置和获取拥有者进程的PID。

ioctl()函数的返回值通常是0表示执行成功,-1表示执行失败,并且错误码保存在 errno 变量中。由于 ioctl() 函数的参数类型和含义不确定,因此在使用时需要参考具体的控制命令和操作系统的文档进行使用。)

lseek()

#include <unistd.h>
   off_t lseek(int fildes, off_t offset, int whence);

调用 lseek()函数可以显示的定位一个已打开的文件。

参数

  • fd:文件描述符。
  • offset:偏移量, 每一读写操作所需要移动的距离, 单位是字节的数量, 可正可负(向前移, 向后移)
  • whence(当前位置基点):
  • SEEK_SET:当前位置为文件的开头, 新位置为偏移量的大小。
  • SEEK_CUR:当前位置为文件指针的位置, 新位置为当前位置加上偏移量。
  • SEEK_END:当前位置为文件的结尾, 新位置为文件的大小加上偏移量的大小返回值成功:文件的当前位移-1:出错
目录
相关文章
|
6月前
|
Java Unix Go
【Java】(8)Stream流、文件File相关操作,IO的含义与运用
Java 为 I/O 提供了强大的而灵活的支持,使其更广泛地应用到文件传输和网络编程中。!但本节讲述最基本的和流与 I/O 相关的功能。我们将通过一个个例子来学习这些功能。
267 2
|
10月前
|
XML JSON Go
Go语言中的文件与IO:JSON、CSV、XML处理
本文介绍了 Go 语言中对 JSON、CSV 和 XML 三种常见数据格式的处理方法。通过标准库 `encoding/json`、`encoding/csv` 和 `encoding/xml`,可以实现结构体与数据格式之间的序列化与反序列化。JSON 适合 Web API 和前后端通信,因其清晰易读;CSV 适用于表格数据和轻量级交换;XML 则支持复杂嵌套结构,常用于配置文件和 SOAP 协议。文中提供代码示例,涵盖基本使用、嵌套结构处理及实战建议,帮助开发者高效操作这些格式。
|
10月前
|
Unix Go
Go语言中的文件与IO:文件读写
本文介绍了 Go 语言中文件操作的基础方法,涵盖打开与关闭文件、读取和写入文件内容、追加写入以及复制文件等功能。通过 `os`、`bufio` 和 `io` 等标准库包,提供了高效且灵活的实现方式,如使用 `os.ReadFile` 读取整个文件、`bufio.Scanner` 逐行读取、`os.Create` 创建文件以及 `io.Copy` 复制文件内容。同时强调了错误处理的重要性,例如使用 `defer` 确保文件关闭,并推荐注意文件权限设置(如 UNIX 系统中的 `0644`)。最后以表格形式总结了常用操作及其推荐方法,便于快速查阅和应用。
|
10月前
|
Go 数据处理
Go语言中的文件与IO:bufio 和 scanner
Go 标准库中的 `bufio` 包高效读写功能,适用于文件和数据处理。`bufio.Reader` 支持按行或分隔符读取,`bufio.Writer` 提供高性能写入并需调用 `Flush()` 确保数据写入。`bufio.Scanner` 是处理文本文件(如日志、配置)的利器,可按行、单词等分割内容。本文详解其用法,并给出实践建议,如统计字符数、模拟 `tail -f` 和词频分析等。
|
存储 网络协议 Linux
【Linux】进程IO|系统调用|open|write|文件描述符fd|封装|理解一切皆文件
本文详细介绍了Linux中的进程IO与系统调用,包括 `open`、`write`、`read`和 `close`函数及其用法,解释了文件描述符(fd)的概念,并深入探讨了Linux中的“一切皆文件”思想。这种设计极大地简化了系统编程,使得处理不同类型的IO设备变得更加一致和简单。通过本文的学习,您应该能够更好地理解和应用Linux中的进程IO操作,提高系统编程的效率和能力。
609 34
|
Java 测试技术 Maven
Maven clean 提示文件 java.io.IOException
在使用Maven进行项目打包时,遇到了`Failed to delete`错误,尝试手动删除目标文件也失败,提示`java.io.IOException`。经过分析,发现问题是由于`sys-info.log`文件被其他进程占用。解决方法是关闭IDEA和相关Java进程,清理隐藏的Java进程后重新尝试Maven clean操作。最终问题得以解决。总结:遇到此类问题时,可以通过任务管理器清理相关进程或重启电脑来解决。
|
存储 Java API
【JavaEE】——文件IO(万字长文)
文件路径,文本文件,二进制文件,File类,文件流,字节流(InputStream,OutputStream)字符流(Reader,Writer)
|
存储 Java
【IO面试题 四】、介绍一下Java的序列化与反序列化
Java的序列化与反序列化允许对象通过实现Serializable接口转换成字节序列并存储或传输,之后可以通过ObjectInputStream和ObjectOutputStream的方法将这些字节序列恢复成对象。
|
Java 大数据
解析Java中的NIO与传统IO的区别与应用
解析Java中的NIO与传统IO的区别与应用
|
Java 大数据 API
Java 流(Stream)、文件(File)和IO的区别
Java中的流(Stream)、文件(File)和输入/输出(I/O)是处理数据的关键概念。`File`类用于基本文件操作,如创建、删除和检查文件;流则提供了数据读写的抽象机制,适用于文件、内存和网络等多种数据源;I/O涵盖更广泛的输入输出操作,包括文件I/O、网络通信等,并支持异常处理和缓冲等功能。实际开发中,这三者常结合使用,以实现高效的数据处理。例如,`File`用于管理文件路径,`Stream`用于读写数据,I/O则处理复杂的输入输出需求。
856 12