逸致

导航

学习笔记4

学习笔记:文件操作

知识点归纳

文件操作级别

硬件级别
fdisk:将硬盘、U盘或SDC盘分区
mkfs:格式化磁盘分区,为系统做好准备
fsck:检查和维修系统
碎片整理:压缩文件系统中的文件

操作系统内核中的文件系统函数
系统调用
I/O库函数
用户命令
sh脚本

文件I/O操作

低级别文件操作

分区

低级别文件操作分区涉及到与磁盘和文件系统直接交互的操作。以下是一些与低级别文件操作分区相关的知识点:

  1. 硬盘分区:了解硬盘分区的概念和原理,包括主分区、扩展分区和逻辑分区等。

  2. 磁盘格式化:了解磁盘格式化的过程和作用,包括创建文件系统、写入文件系统元数据等。

  3. 文件系统:了解不同类型的文件系统,如FAT32、NTFS、EXT4等,以及它们的特点和用途。

  4. 磁盘操作命令:掌握一些用于低级别磁盘操作的命令,如fdiskmkfsmount等,可以用于分区、格式化和挂载磁盘。

  5. 磁盘分区表:了解磁盘分区表的结构和内容,如MBR(主引导记录)和GPT(GUID分区表)。

  6. 磁盘镜像:了解磁盘镜像的概念和用途,包括创建和还原磁盘镜像的方法。

  7. 数据恢复:了解一些基本的数据恢复原理和方法,包括使用工具和技术来恢复误删除或损坏的文件。

这些是低级别文件操作分区的一些基本知识点,它们涉及到与磁盘和文件系统直接交互的操作。

使用系统调用进行文件操作

系统调用
系统调用手册页

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);
}

常用的系统调用

  1. 文件操作:常见的文件操作系统调用包括openclosereadwritelseekstatmkdirrmdirrename等。

  2. 进程管理:常见的进程管理系统调用包括forkexecwaitexitkillgetpidgetppidgetuidgetgidsetuidsetgid等。

链接文件

硬链接文件

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. 知识点1:文件I/O操作

    我在学习文件I/O操作知识点,请你以苏格拉底的方式对我进行提问,一次一个问题。

 - 针对我I/O操作知识点,我理解了吗?

 - 我的回答结束了,请对我的回答进行评价总结。

  1. 知识点2:使用系统调用进行文件操作

    我在学习使用系统调用进行文件操作知识点,请你以苏格拉底的方式对我进行提问,一次一个问题。

    • 针对我系统调用进行文件操作知识点,我理解了吗?

    • 我的回答结束了,请对我的回答进行评价总结。

问题与解决思路

在学习过程中,我遇到了以下问题,并使用chatgpt等AI工具解决:

  1. 问题1:格式化分区具体有什么作用

posted on 2023-10-01 21:20  逸致  阅读(6)  评论(0编辑  收藏  举报