Linux操作组成
一、文件
在 Linux 中,有一句经典的话叫做:一切皆文件。这句话是站在内核的角度说的,因为 在内核中所有的设备 (除了网络接口) 都一律使用 Linux 独有的虚拟文件系统 (VFS) 来管 理。这样做的最终目的,是将各种不同的设备用“文件”这个概念加以封装和屏蔽,简化应 用层编程的难度。文件,是 Linux 系统最重要的两个抽象概念之一 (另一个是进程) 。
1.文件与文件名
文件:一组相关数据的有序集合
文件名:这个数据集合的名称
2.linux的文件分类
b block 块设备文件 按块扫描设备信息 文件IO
c character 字符设备文件 按字符扫描设备信息 文件IO
d directory 目录文件 存放文件信息 目录IO、文件IO
- 普通文件 存放用户信息 标准IO、文件IO
l link 链接文件 与某个指定文件链接 链接IO、文件IO
s socket socket文件 进程间通信 文件IO
p pipe 管道文件 进程间通信 文件IO
3、IO概念
I:输入
O:输出
4.标准IO和文件IO的区别
文件IO:系统调用,是Linux内核的函数接口
没有缓存IO,实时性好
用户空间进程访问内核的接口
把用户从底层的硬件编程中解放出来
极大的提高了系统的安全性
使用户程序具有可移植性
是操作系统的一部分
标准IO:是库函数,是对文件IO的封装
是有缓存的IO,实时性差
库函数为了实现某个功能而封装起来的API集合
提供统一的编程接口,更加便于应用程序的移植
是语言或者应用程序的一部
5、系统调用和库函数
1、库函数与系统调用的关系
2、库函数
库函数对系统调用的封装,用户调用库函数并不能完成对应的功能,而是要由库函数,
调用系统调用实现相关的功能
3、系统调用
Linux内核中的函数接口,称为系统调用
库函数每次调用内核中的代码称为一次系统调用
用户可以通过Linux系统提供的系统调用内核中的接口
二、标准IO
1、操作文件步骤
1、打开文件open
2、读写文件 write/read
3、关闭文件 close
2、打开文件(open)
#查看命令手册
man 3 open原型:FILE *fopen(const char *pathname, const char *mode);
功能: 打开文件、将文件的属性赋予到流中
参数:
pathname:文件路径:带路径的文件名
mode:打开文件的方式以及权限 分6个代号权限 打开文件的情况 写的方式
r 只读 文件必须事先存在
r+ 可读可写 文件必须事先存在清空模式
w 只写 文件不存在则创建清空模式
w+ 可读可写 文件不存在则创建清空模式
a 只写 文件不存在则创建追加模式
a+ 可读可写 文件不存在则创建追加模式返回值:
成功返回:
流:文件指针
失败返回NULL,并返回错误码
3、关闭文件
man 3 fclose
int fclose(FILE *stream);
功能: 关闭相应的流参数: stream:流返回值:
成功:0
失败:EOF
4、三个特殊的流
stdin:标准输入流,从终端接收数据,getc,scanf,getchar都是依赖stdin实现
stdout:标准输出流,向终端打印数据,puts,printf,putchar都是依赖stdout实现
stderr:标准出错流,perror依赖与stderr流实现
5、流的缓存
全缓存:缓存区满刷新,程序结束或者调用fclose刷新,fflush刷新,缓存区大小
(4k == 4096)
应用场景:与文件建立的缓存均为全缓存
行缓存:遇到\n刷新,程序结束或者调用fclose刷新,fflush刷新,缓存区大小
(1k == 1024)
应用场景:与终端建立的缓存均为行缓存,stdin,stdout都是行缓存
不缓存:立即刷新,缓存区大小(0k)
6、流的输入输出
7、普通文件的分类
ASCII码文件
文件中所有内容均为能够在终端显示的ASCII码字符
二进制文件:
保存文件本身的数据(数据可能无法在终端显示或在终端显示乱码)
图片,视频,压缩包 (ASCII码文件是一个特殊的二进制文件)
8、函数接口
1、fputc
man 3 fputc原型:int fputc(int c, FILE *stream);
功能: 对相应的流写入一个字符
参数: c:需要写入的字符的ASCLII码值stream:文件流指针返回值: 成功返回写入的字符的ASCII值 ,失败返回EOF,并返回错误码fputc(ch, stdout) == putchar(ch)
2、fgetc
man 3 fgetc
原型:int fgetc(FILE *stream);
功能:从流中接收一个字符
参数:stream:文件流指针
返回值:成功返回接收到字符的ASCII码值
失败返回EOF(-1)
读到文件末尾返回EOF(-1)
ch = fgetc(stdin) == ch = getchar()
3、fputs
man 3 fputs
原型:int fputs(const char *s, FILE *stream);
功能:将字符串写入流中
参数:s:写入字符串空间首地址
stream:文件流指针
返回值:
成功返回非负值
失败返回EOF
4、fgets
man 3 fgets
原型:char *fgets(char *s, int size, FILE *stream);
功能:从终端接收一行字符串
参数:s:存放字符串空间首地址
size:最多存放元素个数
stream:文件流指针
返回值:
存放数据空间首地址
失败或者读到文件末尾返回NULL
5、fprintf
man 3 fprintf
原型: int fprintf(FILE *stream, const char *format, ...);
功能:向流中写入格式化字符串
参数:stream:文件流指针
format:格式化字符串
返回值:
成功返回打印的字符个数
失败返回负数
printf("hello world!\n");
fprintf(stdout, "hello world!\n");
6、fscanf
man 3 fscanf
原型:int fscanf(FILE *stream, const char *format, ...);
功能:从流中读取格式化的字符串
参数:stream:文件流指针
format:格式化字符串形式
返回值:
成功返回匹配的输入控制符个数
失败或者读到文件末尾返回EOF
7、fwrite
man 3 fwrite
原型:size_t fwrite(const void *ptr, size_t size, size_t
nmemb,FILE *stream);
功能:向流中写入ptr指向的nmemb个元素,每个元素size字节
参数:
ptr:存放数据空间的首地址
size:每个元素的大小
nmemb:元素个数
stream:文件流指针
返回值:
成功返回写入对象的个数
失败返回0
8、fread
man 3 fread
原型:size_t fread(void *ptr, size_t size, size_t nmemb, FILE
*stream);
功能:从流中读取nmemb个对象,存放ptr指向的空间中,每个对象size字节
参数:
ptr:存放数据空间首地址
size:每个元素的大小
nmemb:对象个数
stream:文件流指针
返回值:
成功返回实际读到对象个数
失败返回0
读到末尾返回0
9、fseek
man 3 fseek
原型:int fseek(FILE *stream, long offset, int whence);
功能:设置流的偏移量
参数:
stream:流
offset:偏移量
whence:
SEEK_SET 文件开头
SEEK_CUR 文件当前位置
SEEK_END 文件末尾
返回值:
成功返回0
失败返回-1
void rewind(FILE *stream);
功能:
将流的偏移量重新定位到开头
fseek(stream, 0, SEEK_SET) == rewind(stream)
long ftell(FILE *stream);
功能:
获得流的偏移量
三、文件IO
1. 操作文件步骤:
2. 函数接口:
1. open
man 2 open
int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
功能:
打开文件
参数:
pathname:打开文件名
flags:O_RDONLY 只读
O_WRONLY 只写
O_RDWR 读写
O_CREAT 文件不存在就创建,需要传入第3个参数
O_TRUNC 文件存在截断
O_APPEND 追加
O_ASYNC 异步IO
O_NONBLOCK 非阻塞IO
mode:
rwx:创建该文件的用户对文件是否拥有读写执行的权限
rwx:创建该文件用户同组的用户对文件是否拥有读写执行的权限
rwx:其余人是否对文件拥有读写执行的权限
rwx:7
rw-:6
r-x:5
r--:4
-wx:3
-w-:2
--x:1
---:0
返回值:
成功返回新文件描述符
失败返回-1
2. close
man 2 close
int close(int fd);
功能:
关闭fd对应的文件描述符
请写出标准IO对应的文件IO的操作方式:
"r" open(filename, O_RDONLY);
"r+" open(filename, O_RDWR);
"w" open(filename, O_WRONLY | O_CREAT | O_TRUNC, 0664);
"w+" open(filename, O_RDWR | O_CREAT | O_TRUNC, 0664);
"a" open(filename, O_WRONLY | O_CREAT | O_APPEND, 0664);
"a+" open(filename, O_RDWR | O_CREAT | O_APPEND, 0664);
3. write
man 2 write
ssize_t write(int fd, const void *buf, size_t count);
功能:
将buf开始的count个字节写入文件描述符fd中
参数:
fd:文件描述符
buf:要写入的数据空间首地址
count:写入的字节数
返回值:
成功返回写入文件中字节数
失败返回-1
4. read
man 2 read
ssize_t read(int fd, void *buf, size_t count);
功能:
从文件描述符中读取count个自己数据放入buf对应的空间
参数:
fd:文件描述符
buf:存放数据空间首地址
count:最多存放元素的个数
返回值:
成功返回实际读到字节数
失败返回-1
5. lseek
man 2 lseek
off_t lseek(int fd, off_t offset, int whence);
功能:
重定位流的偏移量
参数:fd:文件描述符offset:偏移量whence:SEEK_SET:文件开头SEEK_CUR:文件当前位置SEEK_END:文件末尾
返回值:
成功返回偏移量
失败返回-1
四:目录IO
1. opendir
man 3 opendir
DIR *opendir(const char *name);
功能:
打开目录获得目录流指针
参数:
name:要打开文件的名称
返回值:
成功返回目录流指针
失败返回NULL
int closedir(DIR *dirp);
功能:
关闭目录流指针
2. closedir
man 3 closedir
int closedir(DIR *dirp);
功能:
关闭目录流指针
3. readdir
man 3 readdir
struct dirent *readdir(DIR *dirp);
功能:
读取下一个目录项的信息
参数:
dirp:目录流指针
返回值:
成功返回读到目录项信息的结构体指针
失败或者读到末尾返回NULL
struct dirent {
ino_t d_ino; /* Inode number */
off_t d_off; /* Not an offset; see below */
unsigned short d_reclen; /* Length of this record */
unsigned char d_type; /* Type of file; not supported
by all filesystem types */
char d_name[256]; /* Null-terminated filename */
};
d_ino:通过这个inode能够找到该文件在磁盘中存放的位置
d_off:当前目录项在整个目录流中的偏移量
d_reclen:这条记录的大小
d_type:文件类型
d_name:文件名
4. mkdir
man 3 mkdir
int mkdir(const char *pathname, mode_t mode);
使用方法:
mkdir(filename, 0777);
目录中
x:用户是否能够进入目录中
w:用户是否能在目录中新建文件
r:用户是否能够读取目录中的信息
5. rmdir
man 2 rmdir
int rmdir(const char *pathname);
功能:
删除空目录文件
使用方法:
rmdir(filename);
6. chdir
man 3 chdir
int chdir(const char *path);
功能:
修改程序当前的工作路径
参数:
path:要切换的路径
返回值:
成功返回0
失败返回-1
7. getcwd
man 3 getcwd
char *getcwd(char *buf, size_t size);
功能:
获得当前工作路径
参数:
buf:将工作路径放入buf对应的空间
size:最多存放字符的个数
返回值:
成功返回存放字符串空间首地址
失败返回NULL