”一切皆文件“
- 文件 = 内容 + 属性
- 对文件的操作 = 对内容,对属性
侠义的文件:普通的磁盘文件;
广义的文件:普通文件、显示器、键盘/鼠标、网卡等设备,都可以看成是文件;
站在系统角度,能够被读取(read)或者能够被写入(write)的设备,都可以称之为文件。
文件类型
一切皆文件,文件类型也有多种,那如何查看文件是什么类型?在Linux中可以使用以下命令:
- ls -l // 以长格式显示文件和目录信息,包括权限、所有者、大小、创建时间等
jye@ubuntu22:~$ ls -l
drwxr-xr-x 3 jye jye 4096 4月 4 12:37 Download
drwxr-xr-x 2 jye jye 4096 3月 29 13:47 Desktop
-rw-rw-r-- 1 jye jye 3299 4月 1 23:22 .bashrc
在使用 ls -l 命令时,第一列的字符表示文件或目录的类型和权限。
其中第一个字符表示文件类型,对照表如下:
第一个字符 | 文件类型 |
---|---|
- | 普通文件 file |
d | 目录 directory |
l | 符号链接 link,类似于windows中的快捷方式 |
c | 字符设备文件 character,如键盘、鼠标、串口、终端等 |
b | 块设备文件 block,就是保存大块数据的设备,比如最常见的硬盘 |
s | 套接字文件 socket,这类文件通常用在网络数据连接或用于跨进程通信 |
p | 管道文件 pipe 主要用于不同进程的信息传递, A进程将需要传递的数据写入管道的一端,B进程从管道的另一端取得所需要的数据 |
- file [文件或目录] // 用于辨识文件类型
jye@ubuntu22:~$ file .bashrc
.bashrc: ASCII text
系统调用
使用系统调用函数时需要添加的头文件是:
#include <sys/types.h>//这里提供类型pid_t和size_t的定义
#include <sys/stat.h>
#include <fcntl.h>
int open(const char *pathname, int flags, mode_t mode);
描述: 当 open() 调用成功, 它会返回一个新的文件描述符(永远取未用描述符的最小值),这个调用创建一个新的打开文件,即分配一个新的独一无二的文件描述符,不会与运行中的任何其他程序共享(但可以通过 fork() 系统调用实现共享)
参数:
- pathname:要打开或创建的文件路径,可以是相对路径也可以是绝对路径
- flags:标志,设置打开方式等 主标志: O_WRONLY[以只写方式打开文件] O_RDONLY[以只读方式打开文件] O_RDWR[以可读写方式打开文件] 副标志: O_TRUNC[若文件存在且以写的方式打开,清空文件内容]
O_APPEND[文件以追加模式打开,所写入的数据追加到文件尾] O_CREAT[若路径中的文件不存在则自动建立该文件]
O_EXCL[如果使用O_CREAT时文件存在,就返回错误信息,它可以测试文件是否存在]
注意:主标志是互斥的,副标志可同时使用多个,使用时在主标志和副标志之间加入按位与(|)运算符- mode:权限设置,普通文件设置为0666
返回值: 成功返回新分配的文件描述符,出错返回-1并设置errno
//以读的方式打开文件,并且清空文件
int fd = open("log.txt", O_WRONLY | O_TRUNC | O_CREAT, 0666);
if (fd < 0)
{
perror("open"); //将错误信息输出,格式:字符串+“:”+错误描述,如:open:No such file or directory
return 1;
}
int close(int fd);
描述: 关闭一个已经打开的文件,并且使文件描述符不在指向任何文件和可以在新的文件操作中被再次使用
参数: fd:就是之前用 open() 获得的一个文件描述符。
返回值: 成功返回0,出错返回-1并设置errno
int fd = open("log.txt", O_WRONLY | O_TRUNC | O_CREAT, 0666);
if (fd < 0)
{
perror("open");
return 1;
}
close(fd);//关闭文件
ssize_t read(int fd, void *buf, size_t count);
描述: 将从文件描述符 fd 对应的文件中读到的数据存在 buf 缓冲区中,每次读 count 字节,同时文件指针会随着移动
参数: count:请求读取的字节数
返回值: 返回实际读入的字节数,可能会小于请求的字节数,如果返回0,表示未读入任何数据,已到达了文件尾;如果返回-1,表示出现了错误。
char buffer[64];
memset(buffer, '\0', sizeof(buffer));
read(fd, buffer, sizeof(buffer));//将文件的内容读取到buffer中去
ssize_t write(int fd, const void *buf, size_t count);
描述: 向文件描述符 fd 所引用的文件中写入从 buf 开始的缓冲区中 count 字节的数据