文章目录
前言
不知不觉,就到大三了。
不知不觉,就要开始找暑期实习了。
温故而知新嘛。(数据结构复习两天发现不对,我还是更喜欢这个。)
所以就来了。
好,言归正传。
因为我刚来CSDN的时候,写的就是服务端编程,后面翻新的时候都会删掉之前的,所以这次更新又是对以前“古董”博客的一次毁灭啊。
但是,不破不立!!!
Linux下的文件
引用一句经典的话:“UNIX下一切皆文件”。
文件是一种抽象机制,它提供了一种方式用来存储信息以及在后面进行读取。
在创建一个文件后,它会给文件一个命名。当进程终止时,文件会继续存在,并且其他进程可以使用名称访问该文件。
文件描述符
在Linux下用文件描述符来表示普通文件和设备文件。文件描述符是一个整型的数据,所有对文件的操作都通过文件描述符完成。
文件描述符是文件系统中连接用户和内核空间的枢纽,当打开和创建一个文件的时候,内核空间会创建相应的结构,并生成一个整型的变量传递给用户空间的对应进程。进程通过这个文件描述符对文件进行操作。
文件描述符的范围是0~OPEN_MAX,因此是一个有限的资源,在使用完之后要及时的释放。
文件描述符仅在一个同一个进程中有效,即不同进程的文件描述符,同一个值可能描述的是不同的文件!!!
在Linux系统中有三个已经被分配的文件描述符,分别是:
0 STDIN_FILENO 标准输入流
1 STDOUT_FILENO 标准输出流
2 STDERR_FILENO 标准错误流
这三个文件描述符和它们各自的功能是绑死的。
文件I/O操作
打开/创建文件
在Linux下,用open函数可以用来打开或创建一个文件:
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int open(const char *pathname,int flags);
int open(const char *pathname,int flags,mode_t mode);
//一般用fd接收返回值
//返回值 :成功返回重新分配的文件描述符,出错则返回-1并设置errno
好多语言基本都是这个函数吧,第一个文件名,第二个打开模式,第三个如果要写,是文件权限。
打开模式:
O_RDONLY 只读
O_WRONLY 只写
O_RDWR 读写
O_APPEND 追加
O_CREAT 有就开,没就建。
O_EXCL 查看文件是否存在,如果同时指定了O_CREAT的话,那文件存在就报错。
O_TRUNC 如果文件存在,则将清空文件。
O_NONBLOCK 打开文件为非阻塞方式。默认为阻塞,即对文件的读写需要等待操作状态返回
最后的那个mode。只有在O_CREAT存在的时候才能使用。
create函数可以理解问open函数的一个特例:
int open(pathname,O_WRONLY|O_CREAT|O_TRUNC,mode);
create配上O_EXCL可提高程序的容错性。
关闭文件
#include <unistd.h>
int close(int fd); //fd:文件描述符
//返回值:成功返回0,失败返回-1并设置errno
读取/写入文件
read函数从打开的文件中读取数据
write函数向打开的文件中写入数据
#include <unistd.h>
ssize_t read(int fd,void *buf,size_t count);
ssize_t write(int fd,void *buf,size_t count);
//返回值:成功返回读取/写入的字节数,失败返回-1并设置errno。
/*
buf:缓存,一般用char数组
count:要读取/写入的字节数
*/
ssize_t是一个可能不同于int、long类型的符号数,它在具体实现是可能定义为 int 或 long。
文件指针偏移
lseek()函数可以设置文件偏移量的位置。
#include <sys/types.h>
#include <unistd.h>
off_t lseek(int fd,off_t offset,int whence);
//这里允许偏移超过文件末尾,中间空出来的位置都是0.
/*
offset:文件偏移量,可以为负数
whence:操作模式
*/
操作模式:
若:SEEK_SET,offset为相对文件开始处的位置
若:SEEK_CUR,offset为相对当前位置的位置
若:SEEK_END,offset为相对文件结尾的位置
函数执行成功时返回文件的偏移量,所以可以在SEEK_CUR模式下偏移0个位置,以获取当前的偏移量