学习笔记4
第七、八章
文件操作
文件操作级别
1.硬件操作
大多数是针对系统的实用程序
2.操作系统内核中的文件系统函数
每个操作系统内核均可为基本文件操作提供支持
3.系统调用
用户模式程序使用系统调用来访问内核函数
每个库函数都会发出一个系统调用,使进程进入内核模式来执行相应的内核函数
4.I/O库函数
5.用户命令
用户可以使用Unix/Linux命令来执行文件操作
6.sh脚本
分区
在计算机存储中,分区(Partition)是将物理存储设备(如硬盘、固态硬盘等)划分为逻辑部分的过程。每个分区被视为独立的存储空间,并被操作系统识别和管理。
分区的主要目的是将物理存储设备划分为多个逻辑单元,使得每个分区可以被独立格式化、挂载以及用于存储文件系统。这样可以提供更灵活和有效的存储管理,以满足不同的需求和使用场景。
每个分区可以具有不同的文件系统类型,例如常见的FAT32、NTFS、EXT4等。每个文件系统都有其特定的功能、性能和限制。
分区还可以有不同的目的,例如:
- 启动分区:在计算机启动过程中,用于存储启动相关的引导程序和操作系统。
- 系统分区:用于安装和运行操作系统及其相关文件。
- 数据分区:用于存储用户数据、应用程序、媒体文件等。
- 交换分区(Swap分区):用于操作系统将部分内存内容临时存储到磁盘,以满足内存需求的扩展。
- 备份分区:用于存储备份和恢复数据。
需要注意的是,每个物理存储设备通常可以被划分为多个分区。分区的大小和数量取决于操作系统和存储设备的限制。
总而言之,分区是将物理存储设备划分为逻辑部分的过程,用于提供独立的存储空间和灵活的存储管理。
系统调用:内核模式(Kmode)用户模式(Umode)
文件操作系统调用函数:
access:检查对某个文件的权限
int access (char *pathname, int mode);
chdir:更改目录
int chdir (const char *path);
chmod: 更改某个文件的权限
int chmod (char *path, mode_t mode);
chown:更改文件所有人
lat chow (char *name, int uid, int gid),
chroot:将(逻辑)根目录更改为路径名
Int chroot (char *pathname);
getcwd:获取 CWD 的绝对路径名
char *getcwd(char *buf, int size);
mkdir:创建目录
int mkdir (char *pathname, mode_t mode) ;
rmdir:移除目录(必须为空)
int rmdir (char *pathname);
link:将新文件名硬链接到旧文件名
int link(char *oldpath, char *newpath);
unlink:减少文件的链接数,如果链接数达到0,则删除文件
int unlink(char *pathname)
symlink:为文件创建一个符号链接
int symlink(char *oldpath, char *path name);
rename:更改文件名称
int rename(char *oldpath, char *newpath);
stat:获取文件状态信息
int stat(char *filename, srtuct stat *buf)
int fstat(int filedes, struct stat *buf)
int lstat(char *filename, srtuct stat *buf)
以mkdir为例的程序:
按照书上的代码写了,编译报错连篇,执行可执行错误的时候野报错:段错误(核心以转储)。但神奇的是依然成功的创建了newdir这个文件夹。
先修正代码部分,不得不说gcc的报错非常清晰明了,知道错误在哪,在询问gpt后加了包含mkdir、strerror、chdir、getcwd函数的头文件 就解决了。
创建成功
至于为什么报错依然能创建还没搞懂 gpt也没有很懂的样子,可能是我提问方式有误,猜想和代码段main函数没错,gcc功能强大有关。
链接文件:
硬链接:命令
ln -s oldpath newpath
对应的系统调用为:
link(char *oldpath, char *newpath)
软链结:命令
ln -s oldpath newpath
创建从newpath到oldpath的软链接或符号链接,对应的系统调用为:
symlink(char *oldpath, char *newpath)
在open-close-lseek中不知道文件描述符是什么,问GPT
苏格拉底挑战:
1.文件I/O操作
2.链接文件