学习笔记4
学习笔记:文件操作
知识点归纳
文件操作级别
硬件级别
fdisk:将硬盘、U盘或SDC盘分区
mkfs:格式化磁盘分区,为系统做好准备
fsck:检查和维修系统
碎片整理:压缩文件系统中的文件
操作系统内核中的文件系统函数
系统调用
I/O库函数
用户命令
sh脚本
文件I/O操作
低级别文件操作
分区
低级别文件操作分区涉及到与磁盘和文件系统直接交互的操作。以下是一些与低级别文件操作分区相关的知识点:
-
硬盘分区:了解硬盘分区的概念和原理,包括主分区、扩展分区和逻辑分区等。
-
磁盘格式化:了解磁盘格式化的过程和作用,包括创建文件系统、写入文件系统元数据等。
-
文件系统:了解不同类型的文件系统,如FAT32、NTFS、EXT4等,以及它们的特点和用途。
-
磁盘操作命令:掌握一些用于低级别磁盘操作的命令,如
fdisk
、mkfs
、mount
等,可以用于分区、格式化和挂载磁盘。 -
磁盘分区表:了解磁盘分区表的结构和内容,如MBR(主引导记录)和GPT(GUID分区表)。
-
磁盘镜像:了解磁盘镜像的概念和用途,包括创建和还原磁盘镜像的方法。
-
数据恢复:了解一些基本的数据恢复原理和方法,包括使用工具和技术来恢复误删除或损坏的文件。
这些是低级别文件操作分区的一些基本知识点,它们涉及到与磁盘和文件系统直接交互的操作。
使用系统调用进行文件操作
系统调用
系统调用手册页
man 2 stat
man 2 open
man 2 read
使用系统调用进行文件操作
以下是示例代码:
#include<stdio.h>
#include<errno.h>
int main()
{
char buf[256],*s;
int r;
r = mkdir("newdir",0766); //mkdir syscall
if(r<0)
printf("error=%d : %s\n",errno,strerror(errno));
r = chdir("newdir"); //cd into newdir
s = getcwd(buf,256); //get CWD string int buf[]
printf("CWD = %s\n",s);
}
常用的系统调用
-
文件操作:常见的文件操作系统调用包括
open
、close
、read
、write
、lseek
、stat
、mkdir
、rmdir
、rename
等。 -
进程管理:常见的进程管理系统调用包括
fork
、exec
、wait
、exit
、kill
、getpid
、getppid
、getuid
、getgid
、setuid
、setgid
等。
链接文件
硬链接文件
ln oldpath newpath
对应系统调用:link(char *oldpath,char *newpath)
减少文件链接数:unlink(char *pathname)
符号链接文件:
ln -s oldpath newpath
创建符号链接或软链接:
symlink(char *oldpath,char *newpath)
stat系统调用
stat文件状态
stat结构体
stat与文件索引节点
文件类型和权限
st_mode:第一个字母表示文件类型,后面9个字符基于权限位,如果位是1,每个字符打印为r|w|x;如果位是0,则打印-。x位表示是否允许访问目录。
opendir-readdir函数
头文件:#include<dirent.h>
readlink函数
int readlink(char *pathname,char buf[],int bufsize);
将符号链接文件的内容复制到bufsize的buf[]中,并将实际复制的字节数返回。
实践##
练习7.2:编写一个c程序myfdisk,将一个虚拟磁盘分成4个主分区。运行程序后,在虚拟磁盘上运行Linux fdisk 来验证结果。
相关的代码:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#define DISK_SIZE 1024 // 虚拟磁盘的大小,单位为字节
#define PARTITION_SIZE DISK_SIZE / 4 // 每个分区的大小
int main() {
int fd;
char diskfile[] = "disk.img"; // 虚拟磁盘文件名
// 创建虚拟磁盘文件
fd = open(diskfile, O_RDWR | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR);
if (fd == -1) {
perror("Failed to create disk file");
exit(1);
}
// 扩展虚拟磁盘文件到指定大小
if (lseek(fd, DISK_SIZE - 1, SEEK_SET) == -1) {
perror("Failed to expand disk file");
close(fd);
exit(1);
}
if (write(fd, "", 1) == -1) {
perror("Failed to expand disk file");
close(fd);
exit(1);
}
// 分区
char command[256];
for (int i = 1; i <= 4; i++) {
snprintf(command, sizeof(command), "echo 'n\np\n%d\n\n+%d\nw' | fdisk %s", i, PARTITION_SIZE, diskfile);
system(command);
}
// 关闭虚拟磁盘文件
close(fd);
printf("Disk partitioning completed.\n");
return 0;
}
运行结果:
苏格拉底挑战
-
知识点1:文件I/O操作
我在学习文件I/O操作知识点,请你以苏格拉底的方式对我进行提问,一次一个问题。
- 针对我I/O操作知识点,我理解了吗?
- 我的回答结束了,请对我的回答进行评价总结。
-
知识点2:使用系统调用进行文件操作
我在学习使用系统调用进行文件操作知识点,请你以苏格拉底的方式对我进行提问,一次一个问题。
-
针对我系统调用进行文件操作知识点,我理解了吗?
-
我的回答结束了,请对我的回答进行评价总结。
-
问题与解决思路
在学习过程中,我遇到了以下问题,并使用chatgpt等AI工具解决:
- 问题1:格式化分区具体有什么作用