前言
在Linux系统编程中,文件操作是核心的一环,它不仅支撑着数据的持久化存储,也是进程间通信的重要手段之一。了解和掌握Linux的文件相关函数,对于任何一位Linux开发者或系统管理员来说,都是必备的技能。本文将总结Linux系统中常用的文件操作函数,旨在为读者提供一个清晰的参考,帮助大家更好地理解和运用这些函数进行高效的文件处理。
open()函数
int open(char *pathname,int flags)
参数:
pathname :文件路径名
flags: 文件打开方式 #include<fcntl.h>
O_RDONLY 只读
O_WRONLY 只写
O_RDWR 读写
O_APPEND 打开文件为追加,不清空原内容
O_CREAT. 创建文件
O_EXCL 检查文件是否存在
O_TRUNC
O_NONBLOCK
返回值:
成功:整数,打开文件得到的对应文件描述符
失败:-1,并设置errno来指示错误类型。
open常见错误:
1.打开文件不存在;
2.以写方式打开只读文件(打开文件没有对应权限);
3.以只写方式打开目录;
open函数是Linux系统中的一个基本而重要的系统调用,它用于打开或创建一个文件,并返回一个文件描述符。
open函数的原型定义在<fcntl.h>头文件中,其作用是建立一个文件描述符,使得其他函数可以通过这个文件描述符对指定文件进行读取或写入操作。open函数的返回值是一个整数,如果操作成功,它将返回一个非负的文件描述符;如果操作失败,它将返回-1,并设置errno以指示错误类型。
read() 函数
ssize_t read (int fd ,void *buf,size_t count);
参数:
fd: 文件描述符;
buf: 存储数据缓冲区,这是指向包含要读取数据的缓冲区的指针;
count: 缓冲区大小;
返回值:
成功:读取时,返回实际读取到的字节数;
到达文件末尾时,返回0;
失败:返回-1,并设置errno来指示错误类型。
read函数在socket中返回值:
>0:实际读到的字节数;
=0:socket()中表示对端关闭;close();
=-1:
如果 errno == EINTR 被异常中断,需要重启;
如果 errno == EAGIN 或 EWOULDBLOCK ,以非阻塞的方式读数据,但是没有数据,需要重新读;
如果 errno == ECONNEREST 说明连接被重置,需要close(),移除监听队列。
在使用read函数时,需要注意以下几点:
- read函数可能会阻塞调用进程,直到有数据可读或遇到文件结束符。如果不希望进程被阻塞,可以使用非阻塞I/O操作。
- read函数读取的是字节流,而不是记录或行。因此,如果需要按行读取,可能需要结合其他函数如
readline()
来实现。 - read函数的性能受到磁盘I/O速度的限制,因此在设计高性能应用程序时,可能需要考虑使用更高效的数据读取策略。
write()函数
ssize_t write(int fd, const void *buf, size_t count);
参数
fd: 文件描述符,这是一个整数,代表了一个已打开的文件或者是可以写入数据的文件描述符。
buf: 缓冲区地址,这是指向包含要写入数据的缓冲区的指针。
count: 字节数,这指定了最多可以从缓冲区中写入多少字节的数据。
返回值:
成功:返回实际写入的字节数;
失败:当有错误发生时则返回-1,错误代码存入errno中。
使用write函数时,需要注意以下几点:
- write函数可能会阻塞调用进程,直到数据被写入或出现错误。如果不希望进程被阻塞,可以使用非阻塞I/O操作。
- write函数写入的是字节流,因此需要确保数据的正确性和格式,特别是在处理文本文件时要注意编码问题。
- write函数的性能受到磁盘I/O速度的限制,因此在设计高性能应用程序时,可能需要考虑使用更高效的数据写入策略。
close()函数
int close (int fd)
参数
fd:文件描述符,这是一个整数,代表了一个已打开的文件或者是可以写入数据的文件描述符。
返回值:
成功关闭文件时,返回0;
当有错误发生时则返回-1,并设置errno中。
使用close函数时,需要注意以下几点:
- close函数可能会阻塞调用进程,直到文件被关闭或出现错误。如果不希望进程被阻塞,可以使用非阻塞I/O操作。
- 当一个进程终止时,内核会对该进程所有尚未关闭的文件描述符调用close关闭,所以即使用户程序不调用close,在终止时内核也会自动关闭它打开的所有文件。但是对于一个长年累月运行的程序(比如网络服务器),打开的文件描述符一定要记得关闭,否则随着打开的文件越来越多,会占用大量文件描述符和系统资源。