1.直接对系统进行操作通常是很慢的,比如c语言标准库的IO部分在内存里开辟了新的缓存区用于减少系统read(),write()的调用,提高了效率,原因:多次调用系统会导致pc指针在内核与用户之间来回跳转,这是很不明智的
优先使用库函数,缓冲区有三种模式,全缓冲,半缓冲,无缓冲,分别对应是否延时,无缓冲类比为即时收发数据
2.open(),write(),read(),以及其他的函数等等,,,都是直接对系统进行操作,
有两种常用接口
1.文件结构体,文件描述符fd
fd存在文件描述符表(实质是一个指针数组)中,fd实际就是该表的下标,每次操作就对下标对应的文件操作,句柄思想,标准输入输出错误都是文件,是被tty(终端)自动打开的,状态阻塞,占据表中的0,1,2下标,可以被重定向,文件描述符会分配当前表中最小的下标
2.文件路径
3.主函数参数 int *argc,int **argv 常用
4.分配的文件描述符是最小的,标准输入输出错误占据了012,所以最小为3
5.三种状态,
睡眠:等待唤醒
运行:正在运行
就绪:已经唤醒等待排队
6.睡眠态会导致进程卡住,虽然不占用cpu资源,但是无法执行其他程序,此时运用轮询机制,循环内不断访问,但是每次询问结束使用sleep(1),延时一秒执行其他程序,一秒对于计算机来说已经很长了
7.可以用fseek的ftell来测量文件大小,文件尾部使用ftell
8.fcntl得到文件状态
9.重定向操作时,重定向部分被shell自动替换,不算入参数范围
10.ioctl得到窗口大小,宏TIOCGWINSZ
11.mmap()可以将磁盘中的数据映射到内存中然后进行操作,munmap()关闭映射
12.文件系统各有不同,但大都由ext2发展而来,文件系统虽然不同,但由vfs(虚拟系统)统一
13.文件系统逻辑为
根目录inode表》》》目录块地址》》》文件名匹配》》》文件名对应inode表地址》》》文件inode表》》》文件块地址也就是文件内容
14.stat可以查看inode信息,因为目录文件类型某些情况的不兼容,无法使用目录操作的dirread读取,所以,可以用stat查看
15.目录操作与普通文件不同
16.dup可以进行文件进程的复制与重定向,重定向时会断开之前的链接,例如:将标准输出重定向到fd4,原本fd1就将不再指向标准输出
17. 软链接:独立的链接文件,有自己的inode,
硬链接:原文件的别名,和原文件指向同一个inode
18. l 开头的函数,比如lstat,是对 链接文件 自己操作,而不是对链接文件的链接对象进行操作
19. 同一个磁盘内部的文件复制粘贴很快,因为实际上只是将inode表复制粘贴,文件内容并没有移动,通过移动后的inode表里的数据地址依然可以访问到文件内容,类似于,只是移动了查找文件的地址,并没有移动文件本身,10G文件其实只移动了相对来说很小的inode表
20.不同磁盘的文件管理系统不同,所以文件再磁盘间转移非常耗时,因为整个都移动了,10G文件就移动10G文件