首页 > 其他分享 >第四周学习笔记

第四周学习笔记

时间:2023-10-01 10:37:12浏览次数:30  
标签:char 文件 int 笔记 学习 mode 四周 buf 链接

1.文件操作

硬件级别

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

操作系统中的文件系统函数

#前缀k表示内核函数
kmount(), kumount()		(mount/umount file systems)
kmkdir(), krmdir()		(make/remove directory)
kchdir(), kgetcwd()		(change directory, get CWD pathname)
klink(),  kunlink()		(hard link/unlink files)
kchmod(), kchown(), kutime()	(change r|w|x permissions,owner,time)
kcreat(), kopen()		(create/open file for R,W,RW,APPEND)
kread(),  kwrite()		(read/write opened files)
klseek(), kclose()		(lseek/close file descriptors)
ksymlink(), kreadlink()		(create/read symbolic link files)
kstat(),  kfstat(), klstat()	(get file status/information)
kopendir(), kreaddir()		(open/read directories)

I/O库函数

  1. FILE mode I/0: fopen(),fread(); fwrite(),fseek(),fclose(),fflush()
  2. char mode I/0: getc(), getchar(),ugetc(); putc(),putchar()
  3. line mode I/0: gets(), fgets(); puts(), fputs()
  4. formatted I/0: acanf(),fscanf(),sscanf(); printf(),fprintf(),sprintf()
用户命令

mkdir, rmdir, cd, pwd, ls, link, unlink, rm, cat, cp, mv, chmod, etc.

低级别文件操作

分区

创建一个叫mydisk的虚拟磁盘

dd if=/dev/zero of=mydisk bs=1024 count=1440

在磁盘映像上运行fdisk

fdisk mydisk
格式化分区
#每块都是bsize字节
mkfs -t TYPE [-b bsize] device nblocks

假设是 EXT2/3 文件系统,它是 Linux 的默认文件系统。

mkfs -t ext2 vdisk 1440  或  mke2fs vdisk 1440
sudo mount -o loop vdisk /mnt
sudo umount /mnt  或  sudo umount vdisk
挂载分区
#(1)用dd命令创建一个虚拟磁盘映像
dd if=/dev/zero of=mydisk bs=1024 count=32768
#(2)在vdisk上运行fdisk来创建一个分区P1
fdisk vdisk
#(3)使用以下扇区数在vdisk的分区1上创建一个循环设备
losetup -o $(expr 2048 \* 512) --sizelimit $(expr 65535 \* 512) /dev/loop1
vdisk
losetup -a
#(4)格式化/dev/loop1,它是一个EXT2文件系统
mke2fs -b 4096 /dev/loop1 7936
#(5)挂载循环设备
mount /dev/loop1 /mnt
#(6)访问作为文件系统一部分的挂载系统
(cd /mnt; mkdir bin boot dev etc user)
#(7)设备使用完毕后,将其卸载
umount /mnt
#(8)循环设备使用完毕后,通过以下命令将其断开
losetup -d /dev/loop1

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

系统调用

系统调用(System Call)是操作系统提供给应用程序的一种接口,应用程序可以通过系统调用请求操作系统执行特权指令,以完成一些需要特权级别的任务,如文件操作、进程管理、网络通信等。系统调用提供了用户空间程序与内核空间之间的通信机制。

  1. 文件系统相关:如open、close、read、write、lseek等,用于文件的打开、关闭、读取和写入操作。

  2. 进程管理:如fork、exec、exit、wait等,用于创建进程、执行新程序、退出进程以及等待子进程结束。

  3. 内存管理:如brk、mmap、munmap等,用于动态分配和释放内存空间。

  4. 网络通信:如socket、bind、connect、send、recv等,用于创建网络套接字、建立连接、发送和接收网络数据。

  5. 时间和日期:如time、gettimeofday等,用于获取系统时间和日期信息。

  6. 信号处理:如kill、signal等,用于发送信号和处理信号。

  7. 用户权限:如getuid、setuid、getgid、setgid等,用于获取和设置用户的权限和身份。

简单的系统调用

  • access:检查对某个文件的权限
int access(char *pathname, int mode);
  • chdir:更改目录
int chdir(const char *path);
  • chmod:更改某个文件的权限
int chmod(char *path, mode_t mode);
  • chown:更改文件所有人
int chown(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, int *newPath);
  • unlink:取消某个文件的链接;如果文件的链接数为0,则删除文件
int unlink(char *pathname);
  • symlink:创建一个符号链接
int symlink(char *target, char *newpath);
  • rename:更改文件名称
int rename(char *oldPath, int *newPath);
  • utime:更改文件的访问和修改时间
int utime(char *pathname, struct utimebuf *time);

以下系统调用需要超级用户权限。

  • mount:将文件系统添加到挂载点目录上
int mount(char *specialfile, char *mountDir);
  • umount:分离挂载的文件系统
int umount(char *dir);
  • mknod:创建特殊文件
int mknod(char *path, int mode, int device);

常用的系统调用

  • stat:获取文件状态信息
int stat(char *filename, struct stat *buf);
int fstat(char filedes, struct stat *buf);
int lstat(char *filename, struct stat *buf);
  • open:打开一个文件进行读、写、追加
int open(char *file, int flags, int mode);
  • close:关闭打开的文件描述符
int read(int fd);
  • read:读取打开的文件描述符
int read(int fd, char buf[], int count);
  • write:写入打开的文件描述符
int write(int fd, char buf[], int count);
  • lseek:重新定位文件描述符的读/写偏移量
int lseek(int fd, char offset, int whence);
  • dup:将文件描述符复制到可用的最小描述符编号中
int dup(int oldfd);
  • dup2:将 oldfd 复制到 newfd 中,如果 newfd 已打开,先将其关闭
int dup2(int oldfd, int newfd);
  • link:将新文件硬链接到旧文件
int link(char *oldPath, int *newPath);
  • unlink:取消某个文件的链接;如果文件的链接数为0,则删除文件
int unlink(char *pathname);
  • symlink:创建一个符号链接
int symlink(char *target, char *newpath);
  • readlink::读取符号链接文件的内容
int readlink(char *path, char *buf, int bufsize);
  • umask:设置文件创建掩码;文件权限为(mask & ~umask)
int umask(int umask);

链接文件

硬链接文件

硬链接:命令

ln oldpath newpath

创建从 newpath 到 oldpath 的硬链接,对应的系统调用为:

link(char *oldPath, int *newPath)

符号链接文件

软连接:命令

ln -s oldpath newpath	# ln command with the -s flag

创建从 newpath 到 oldpath 的软链接或符号链接,对应的系统调用为:

symlink(char *target, char *newpath)

部分代码

#ls#

#include <stdio.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
#include <pwd.h>
#include <grp.h>
#include <time.h>
#include <string.h>

int main(int argc,char * argv[]){
    if(argc<2){
        printf("%s need filename\n",argv[0]);
        return -1;
    }
    struct stat st;
    int ret=stat(argv[1],&st);
    if(ret==-1){
        perror("stat");
        return -1;
    }
    char perms[11]={0}; 

    switch (st.st_mode & S_IFMT){
        case S_IFLNK:
            perms[0]='l';
            break;
        case S_IFDIR:
            perms[0]='d';
            break;
        case S_IFREG:
            perms[0]='-';
            break;
        case S_IFBLK:
            perms[0]='b';
            break;
        case S_IFCHR:
            perms[0]='c';
            break;
        case S_IFSOCK:
            perms[0]='s';
            break;
        case S_IFIFO:
            perms[0]='p';
            break;
        default:
            perms[0]='?';
            break;
    }
    
    perms[1]=(st.st_mode & S_IRUSR) ? 'r':'-';
    perms[2]=(st.st_mode & S_IWUSR) ? 'w':'-';
    perms[3]=(st.st_mode & S_IXUSR) ? 'x':'-';
    perms[4]=(st.st_mode & S_IRGRP) ? 'r':'-';
    perms[5]=(st.st_mode & S_IWGRP) ? 'w':'-';
    perms[6]=(st.st_mode & S_IXGRP) ? 'x':'-';
    perms[7]=(st.st_mode & S_IROTH) ? 'r':'-';
    perms[8]=(st.st_mode & S_IWOTH) ? 'w':'-';
    perms[9]=(st.st_mode & S_IXOTH) ? 'x':'-';

    int linkNum=st.st_nlink;

    char * fileUser = getpwuid(st.st_uid)->pw_name;
    char * fileGrp = getgrgid(st.st_gid)->gr_name;
    long int fileSize = st.st_size;
    char * time = ctime(&st.st_mtime);

    char mtime[512]={0};
    strncpy(mtime,time,strlen(time)-1);

    char buf[1024];
    sprintf(buf,"%s %d %s %s %ld %s %s",perms,linkNum,fileUser,fileGrp,fileSize,mtime,argv[1]);
    printf("%s\n",buf);
    return 0;
}

标签:char,文件,int,笔记,学习,mode,四周,buf,链接
From: https://www.cnblogs.com/qi-yu-lin/p/17738623.html

相关文章

  • 2023-2024-1 20231312 《 计算机基础与程序设计》第1周学习总结
    作业信息|这个作业属于哪个课程|<班级的链接>2023-2024-1-计算机基础与程序设计||这个作业要求在哪里|<作业要求链接>2023-2024-1计算机基础与程序设计第一周作业||这个作业的目标|<快速浏览一遍教材《计算机科学概论》,并提出自己不......
  • GDI+学习笔记
    Graphics对象(代表设备上下文)是唯一在绘图操作之间持续存在的对象。一个设计良好的使用GDI+的应用程序将需要在幕后做很多额外的工作,即它必须确保绘图有效地进行,并且在需要时更新屏幕,而不会发生任何不必要的绘图(这一点很重要,因为大多数绘图工作都会对应用程序造成很大的性能......
  • 信息安全系统设计与实现课程第七、八章学习笔记
    一、知识点归纳1.1、文件操作级别文件操作分为五个级别,按照从低到高的顺序排列如下:(1)硬件级别:硬件级别的文件操作包括:fdisk:用于将硬盘、U盘或SD卡等存储设备分区。mkfs:用于格式化磁盘分区,为文件系统做好准备。fsck:用于检查和维修文件系统的一致性。碎片整理:用于压缩......
  • 9.30 读书笔记
    《代码大全2》是一个经典的软件开发书籍,是一本非常有价值的资源,包含了许多软件开发中的重要主题。书中提醒读者以解决问题为导向,不仅仅是完成任务。防御式编程,防御式编程不是指不让别人批评代码,而是指确保要承担的责任,保证方法不会因为传入错误数据而破坏,看似微小的防范,收益可能......
  • 代码大全读书笔记
    代码质量和软件开发的关系:代码质量直接影响软件开发的效率和可维护性。良好的代码质量可以提高代码的可读性、可理解性和可扩展性,减少调试和修复错误的时间和工作量。编写高质量代码的原则:模块化和信息隐藏:将代码分解为小的、独立的模块,并通过封装隐藏内部实现细节。适当......
  • 学期2023-2024-1 学号20231315 《计算机基础与程序设计》第一周学习总结
    学期2023-2024-1学号20231315《计算机基础与程序设计》第一周学习总结作业信息这个作业属于哪个课程?2023-2024-1《计算机基础与程序设计》这个作业要求在哪里?2023-2024-1《计算机基础与程序设计》这个作业的目标?**快速浏览一遍教材计算机科学概论,课本每章提出......
  • 学习笔记4 截图+代码
    学习笔记4一、苏格拉底挑战二、学习时遇见的问题利用gpt解决三、实践stat和opendir-readdir四、实践代码使用stat结构体:#include<stdio.h>#include<sys/stat.h>intmain(){structstatfileStat;//获取文件属性......
  • lapce源码学习-编译调试
    master分支调试1、报错:`#![feature]`maynotbeusedonthestablereleasechannel2、Channel切换到nightly,报错:thetraitbound`file_type::FileType:std::sealed::Sealed`isnotsatisfied3、Channel切换到beta,编译ok,但提示不能调试rustupinstallbeta4、编译成功后,......
  • 《信息安全系统设计与实现》第四周学习笔记
    《信息安全系统设计与实现》第四周学习笔记第七章:文件操作文件操作级别硬件级别fdisk:将硬盘、U盘或SDC盘分区mkfs:格式化磁盘分区,为系统做好准备fsck:检查和维修系统碎片整理:压缩文件系统中的文件操作系统内核中的文件系统函数每个操作系统内核均可为基本文件操作提供......
  • 读书笔记-9月
    读了程序员修炼手册的第一章,学到了一些东西。看视频教程的时候要跟着做,一行一行的跟着敲,一个项目敲完了,再试着加一些自己的功能,按照自己的思路敲一些代码,收获远比干听大的多。量变会引起质变的。学习的时候要先建立知识点的体系,体系学完了再慢慢抠细节,这样才有足够的学习效率。......