【Linux】文件操作

”一切皆文件“

  • 文件 = 内容 + 属性
  • 对文件的操作 = 对内容,对属性

侠义的文件:普通的磁盘文件;
广义的文件:普通文件、显示器、键盘/鼠标、网卡等设备,都可以看成是文件;

站在系统角度,能够被读取(read)或者能够被写入(write)的设备,都可以称之为文件。

在这里插入图片描述

文件类型

一切皆文件,文件类型也有多种,那如何查看文件是什么类型?在Linux中可以使用以下命令:

  1. 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进程从管道的另一端取得所需要的数据
  1. 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 字节的数据

总结:我们在应用层看到的一个简单的动作,在系统接口层面甚至可能OS层面,可能做了非常多的事情

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值