《信息安全系统设计与实现》第四周学习笔记
一、课程内容第七章学习
文件操作级别
1、硬件级别
- fdisk
- mkfs
- fsck
- 碎片整理
2、操作系统内核中的文件系统函数
3、系统调用
4、I/O库函数
5、用户命令
6、sh脚本
低级别的文件操作中的常用函数:
打开和关闭文件:
open():打开文件并返回文件描述符。
close():关闭文件。
读写文件:
read():从文件中读取数据。
write():向文件中写入数据。
移动文件指针:
lseek():在文件中移动指针的位置。
创建和删除文件:
creat():创建新文件。
unlink():删除文件。
重命名文件:
rename():更改文件名。
创建和删除目录:
mkdir():创建新目录。
rmdir():删除空目录。
文件I/O操作
格式化和划分磁盘分区
设备和分区表示:
在Linux中,磁盘设备通常被表示为/dev/sdX,其中X是字母a、b、c等,代表不同的物理设备。
分区通常以数字表示,例如/dev/sda1代表设备/dev/sda上的第一个分区。
分区工具:
fdisk:用于创建、删除和管理磁盘分区。
parted:支持磁盘操作,包括创建、删除、调整分区大小等。
格式化分区:
在分区创建后,我们需要对其进行格式化,以便在其上创建文件系统。
常见的文件系统格式包括Ext4、XFS、NTFS等。
格式化命令示例:mkfs.ext2 /dev/sda1表示将/dev/sda1分区格式化为Ext2文件系统。
#!/bin/bash
# 使用 parted 创建分区
parted /dev/sda mklabel gpt
parted /dev/sda mkpart primary ext2 1MiB 100%
# 格式化分区为 EXT2 文件系统
mkfs.ext2 /dev/sda1
# 创建挂载点目录
mkdir /mnt/mydisk
# 挂载分区
mount /dev/sda1 /mnt/mydisk
# 设置开机自动挂载
echo "/dev/sda1 /mnt/mydisk ext2 defaults 0 0" >> /etc/fstab
二、课程内容第八章学习
软链接:指向目标文件或目录的路径。
创建软链接:使用ln -s 源文件 目标链接命令创建软链接。
软链接特点:软链接文件大小很小,且具有自己的inode号和权限。删除原始文件不会影响软链接的可用性。
硬链接:多个文件名指向同一个文件数据的链接。
创建硬链接:使用ln 源文件 目标链接命令创建硬链接。
硬链接特点:硬链接与原始文件具有相同的文件大小、inode号和权限。删除原始文件仍然可以通过硬链接访问数据。
软链接与硬链接之间的区别:
路径:软链接是一个路径名,而硬链接是一个直接链接到文件数据块的路径。
文件类型:软链接是一个特殊的文件类型,而硬链接是普通文件。
跨文件系统:软链接可以跨越不同的文件系统,而硬链接只能在同一个文件系统内创建。
大小:硬链接与原始文件的大小相同,而软链接的大小很小。
代码例子
#!/bin/bash
# 创建一个名为myfile的文件
echo "This is myfile." > myfile
# 创建一个硬链接
ln myfile hardlink
# 创建一个符号链接
ln -s myfile softlink
# 显示文件和链接的信息
echo "Original file:"
ls -li myfile
echo "Hard link:"
ls -li hardlink
echo "Soft link:"
ls -li softlink
stat结构体:
用于获取文件或目录的状态信息的数据结构。它定义在 <sys/stat.h> 头文件中,包含了如下字段:
dev_t st_dev:表示设备 ID,用于标识文件所在的设备。
ino_t st_ino:表示索引节点号,用于唯一标识文件。
mode_t st_mode:表示文件类型和访问权限。可以使用 st_mode 与 S_IRWXU、S_IRWXG、S_IRWXO 进行按位与运算来获取相应的权限。
nlink_t st_nlink:表示文件的硬链接数,即有多少个目录项指向该文件。
ls程序
基本语法:ls [选项] [文件或目录]。
可以省略文件或目录参数,默认列出当前目录的内容,用于列出指定目录中的文件和子目录。
-l:以长格式显示文件和目录的详细信息,包括权限、所有者、大小、修改时间等。
-a:显示所有文件和目录
-h:以可读的方式显示文件大小,比如使用 KB、MB、GB 等单位。
-r:以相反的顺序显示文件和目录。
-t:按照修改时间排序,最新的文件或目录排在前面。
-d:仅显示目录本身,而不显示目录下的文件和子目录。
三、代码实践
8.11编译项目:设计一个linux中的c语言代码,让其可以把src递归复制到dest文件夹中,功能与cp -r src dest完全一致
1、建立需要复制的文件夹和文件
2、编写代码,编译生成
3、成功运行,复制文件夹到dest2_dir中
代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <dirent.h>
#include <sys/stat.h>
void recursive_copy(const char *source_dir, const char *dest_dir) {
DIR *dir;
struct dirent *entry;
struct stat statbuf;
char source_path[PATH_MAX];
char dest_path[PATH_MAX];
dir = opendir(source_dir);
if (dir == NULL) {
perror("opendir");
return;
}
if (mkdir(dest_dir, 0755) == -1) {
perror("mkdir");
closedir(dir);
return;
}
while ((entry = readdir(dir)) != NULL) {
if (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0) {
continue;
}
snprintf(source_path, sizeof(source_path), "%s/%s", source_dir, entry->d_name);
snprintf(dest_path, sizeof(dest_path), "%s/%s", dest_dir, entry->d_name);
if (lstat(source_path, &statbuf) == -1) {
perror("lstat");
closedir(dir);
return;
}
if (S_ISDIR(statbuf.st_mode)) {
recursive_copy(source_path, dest_path);
} else {
if (link(source_path, dest_path) == -1) {
perror("link");
closedir(dir);
return;
}
}
}
closedir(dir);
}
int main(int argc, char *argv[]) {
if (argc != 3) {
fprintf(stderr, "Usage: %s source_dir dest_dir\n", argv[0]);
return 1;
}
recursive_copy(argv[1], argv[2]);
return 0;
}
四、苏格拉底问答
五、其他
代码中遇到的问题
gdb学习
代码开始我遇到了问题,求助gpt,gpt让我进行验证
在这里我学习到了怎么利用gdb来诊断和调试程序中的错误
代码中使用的知识点
文件和目录操作: 在 C 语言中,可以使用 <dirent.h> 头文件中定义的 DIR、dirent 和 <sys/stat.h> 头文件中定义的 stat 来进行文件和目录操作。
打开目录:使用 DIR *opendir(const char *dirname) 函数来打开指定路径的目录。它返回一个指向目录流的指针,或者返回 NULL 如果目录打开失败。
遍历目录:通过调用 readdir(DIR *dirp) 函数来遍历打开的目录。该函数会读取下一个目录项,并返回一个指向 dirent 结构体的指针,或者返回 NULL 表示已经读取完所有目录项。
查询文件信息:使用 int stat(const char *pathname, struct stat *statbuf) 函数来获取指定路径上的文件信息。它接受文件路径作为参数,并将结果存储在 stat 结构体中。成功返回 0,失败返回 -1。