文件管理
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系统不以后缀名去区分文件类型
,后缀名的作用就是确定用哪个软件打开它。
0-8:权限位,9-11:权限修饰位,12-15:文件类型。
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位:
对于文件来说:实现交换技术。
对于目录来说:使目录里的文件只能被创建者删除。
文件权限:
- r 读权限 值:4
- w 写权限 值:2
- x 执行权限 值:1 (对于普通文件代表执行权限,对于目录文件,代表可进入权限)
- -无权限 值:0
chmod XXX filename (0<= x <= 7) [-R 修改目录下的所有文件的权限]