linux学习笔记_3.文件管理

文件管理

Linux下常规文件、目录、设备、通道都属于文件。分为二进制和文本文件
文本文件:ASCII文件,每个字节存放一个ASCII码字符,以EOF结束。
二进制文件:数据按其在内存中中的形式存储数据

基于流的操作最终会调用read或者write函数进行操作,调用系统操作–>CPU状态转换–>上下文切换。为了使程序的运行效率最高,流对象通常会提供缓冲区,以减少调用系统I/O库函数的次数。

基于流的I/O提供以下2种缓冲: 将数据的读写集中,减少系统调用的次数

1,全缓冲:直到缓冲区填满,才调用系统I/O函数。对于读操作来说,直到读入的内容的字节数等于缓冲区大小或者文件以经到达结尾,才进行I/O操作将外存文件内容读入缓冲区;对于写操作来说,直到缓冲区填满,才进行实际的I/O操作将缓冲区内容写到外存文件中。磁盘文件通常是全缓冲的。默认大小BUFSIZ与系统定义有关。

2,行缓冲:直到遇到换行符\n才调用系统I/O函数。对于读操作来说,遇到换行符\n才进行I/O操作,将所读内容写入缓冲区;对于写操作来说,遇到换行符\n才进行I/O操作,将缓冲区内容写到外存。由于缓冲区大小是有限制的,所以当缓冲区填满时即使没有遇到\n,也同样会进行实际的I/O操作。标准输入stdin和标准输出stdout都默认是行缓冲的。

3,无缓冲:没有缓冲区,数据会立即读入或者输出到外存文件和设备上。标准出错stderr是无缓冲的,这样也能保证错误提示和输出能及时地反馈给用户,供用户排除错误。

系统默认为每个进程打开三个文件,标准输入流(/dev/stdin),标准输出流(/dev/stdout),标准错误输出流(/dev/stderr)。

输入流:键盘 某个文件 管道等
输出流:错误输出流:显示器 文件 管道
在shell应用中,重定向操作就是修改输入\输出流

fopen():FILE *fopen(const char *filename, const char *mode),filename – 字符串,表示要打开的文件名称。
mode – 字符串,表示文件的访问模式,可以是以下表格中的值:
该函数返回一个 FILE 指针。否则返回 NULL,且设置全局变量 errno 来标识错误。

r/rb 以只读方式打开,读位置位于文件开始
r+/rb+ 以可读写方式打开,读写位置位于文件开始
w/wb 以只写打开,文件存在则清空,不存在则创建,写位置位于文件开头
w+ 读写,文件存在清空,写位置位于文件开头
a 只写追加文件,文件存在,则写入数据追加到文件后面,写位置始终位于文件尾部
a+ 可读写追加文件,读位置位于文件开头,写位置位于文件结尾

fclose(): int fclose(FILE *stream) 关闭流 stream。刷新所有的缓冲区。如果流成功关闭,则该方法返回零。如果失败,则返回 EOF。

setbuf(): void setbuf(FILE *stream, char *buffer) 定义流 stream 应如何缓冲。该函数应在与流 stream 相关的文件被打开时,且还未发生任何输入或输出操作之前被调用一次。
stream – 这是指向 FILE 对象的指针,该 FILE 对象标识了一个打开的流。buffer – 这是分配给用户的缓冲,它的长度至少为 BUFSIZ 字节,BUFSIZ 是一个宏常量,表示数组的长度。为NULL则关闭缓冲区

setvbuf(): int setvbuf(FILE *stream, char *buffer, int mode, size_t size) 定义流 stream 应如何缓冲。
stream – 这是指向 FILE 对象的指针,该 FILE 对象标识了一个打开的流。
buffer – 这是分配给用户的缓冲。如果设置为 NULL,该函数会自动分配一个指定大小的缓冲。
mode – 这指定了文件缓冲的模式:

_IOFBF全缓冲:对于输出,数据在缓冲填满时被一次性写入。对于输入,缓冲会在请求输入且缓冲为空时被填充。
_IOLBF行缓冲:对于输出,数据在遇到换行符或者在缓冲填满时被写入,具体视情况而定。对于输入,缓冲会在请求输入且缓冲为空时被填充,直到遇到下一个换行符。
_IONBF无缓冲:不使用缓冲。每个 I/O 操作都被即时写入。buffer 和 size 参数被忽略。

如果成功,则该函数返回 0,否则返回非零值。

fflush(): int fflush(FILE *stream) 刷新流 stream 的输出缓冲区。如果成功,该函数返回零值。如果发生错误,则返回 EOF,且设置错误标识符(即 feof)。

字符读取文件流:

fgetc(): int fgetc(FILE *stream) 从指定的流 stream 获取下一个字符(一个无符号字符),并把位置标识符往前移动。该函数以无符号 char 强制转换为 int 的形式返回读取的字符,如果到达文件末尾或发生读错误,则返回 EOF。

fputc(): int fputc(int char, FILE *stream) 把参数 char 指定的字符(一个无符号字符)写入到指定的流 stream 中,并把位置标识符往前移动。如果没有发生错误,则返回被写入的字符。如果发生错误,则返回 EOF,并设置错误标识符。

行读取文件流:

fputs()、fgets()

块读取文件流:

fread()、fwrite()

文件流检测:

feof():如果文件结束,返回1,否则为0。

ferror():检查文件流是否出现错误。

文件流定位:

ftell():返回当前指针位置距离文件开始的字节数。如果失败返回-1.

fseek([文件指针]、[偏移量]、[偏移基准:0开始,1当前位置,2结束]):修改当前读写位置。

rewind():重置当前读写位置,会到开头的位置。

文件类型及属性

Linux系统认为一切皆文件,所以Linux将所有的东西都看作是文件,将其分了这些类:

普通文件:“-”
目录文件:“d” (directory)
管道文件:进程间通讯的一种手段,“p” (piping)
链接文件:软链接(字符链接)和硬链接,软链接可以认为是windows下的快捷方式,“l” (link)
设备文件:块设备:可以从任意位置读取一定长度的设备,例如磁盘、U盘、TF卡等,块设备 “b” (block)
设备文件:字符设备,只能一字节一字节的读取,不能随机读取,例如鼠标、键盘等,字符设备 “c” (char)
套接字文件:网络通讯的一种方式,“s” (socket)

Linux系统不以后缀名去区分文件类型,后缀名的作用就是确定用哪个软件打开它。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xszn8Wvb-1664157965199)(C:\Users\nice\AppData\Roaming\Typora\typora-user-images\image-20220801163737270.png)]

0-8:权限位,9-11:权限修饰位,12-15:文件类型。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-m3AFAw4j-1664157965201)(C:\Users\nice\AppData\Roaming\Typora\typora-user-images\image-20220801164223184.png)]

SUID位:
主要针对可执行文件。如果一个文件的setuid被设置,则该文件被执行时,进程的有效用户ID(EUID)被设置成该文件的所有者。
设置了setuid位,在普通用户执行passwd操作时,他对/etc/passwd文件的操作上升至root用户权限,即可进行修改操作。
而当操作结束,它又回到普通用户的权限。
这种机制对于某些需要root用户启动,但启动后需要回到普通用户权限的程序很有帮助。

SGID位
作用与SUID类似。
此为usr/bin/passwd可执行文件的权限: -rwsr-xr-x
关于SUID和SGID的表示:
x:只有可执行权限。
s:既有可执行权限,SUID(SGID)位也被设置
S:没有可执行权限,只有SUID(SGID)被设置

sticky位:
对于文件来说:实现交换技术。
对于目录来说:使目录里的文件只能被创建者删除。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2SzP49HM-1664157965202)(C:\Users\nice\AppData\Roaming\Typora\typora-user-images\image-20220801163402444.png)]

文件权限:

  • r 读权限 值:4
  • w 写权限 值:2
  • x 执行权限 值:1 (对于普通文件代表执行权限,对于目录文件,代表可进入权限)
  • -无权限 值:0

chmod XXX filename (0<= x <= 7) [-R 修改目录下的所有文件的权限]

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值