首页 > 其他分享 >学习笔记4

学习笔记4

时间:2023-09-28 19:46:45浏览次数:31  
标签:char 调用 文件 int 笔记 st 学习 链接

第7章 文件操作——教材知识点归纳

7.1文件操作级别

linux中文件操作可以分为5个级别,从低等级到高等级分别为:

  1. 硬件级别:fdisk:将盘进行分区。
    mkfs:格式化磁盘分区。
    fsck:检查系统。
    碎片整理:压缩文件系统中的文件

  2. 内核中的文件系统函数
    k开头,从操作系统内核层面提供文件操作支持。

  3. 系统调用
    用户模式程序使用系统调用来访问内核函数。常见函数有open()、read()、lseek()、close()等,在第8章中有相关内容。

  4. I/O库函数,使用库函数进行文件操作,在第9章中有相关内容。

  5. 用户命令
    直接在终端进行文件操作使用的命令。

7.2文件I/O操作

教材上的图片充分展示了文件操作执行的原理和操作,分为内核的以及用户进行的操作。

7.3低级别文件操作

磁盘可以被划分成多个逻辑单元,称为分区。操作系统引导程序可以从不同的分区引导不同的操作系统。有主引导记录(MBR)。MBR可以将硬盘分为多个区,扩展分区在扩展分区区域内形成一个链表,对应多个分区。
fdisk将一个存储设备进行分区。而仅仅使用fdisk完成的分区并不能使用,还需要格式化分区。格式化分区的作用是为特定的文件系统准备分区,来存储文件。使用的是mkfs命令。

7.4——7.5 ext2文件系统

Linux使用的默认文件系统就是ext2。ext2文件系统总共有1440个块,每个块大小1KB。其中B0是引导块,文件系统不使用,它用于容纳引导操作系统时使用的引导程序。
B1是超级块,用于容纳关于整个文件系统的信息。

第8章 使用系统调用进行文件操作——教材知识点归纳

8.1~8.2系统调用和I/O库函数

操作系统中,进程以两种不同的方式运行:内核模式(Kmode)和用户模式(Umode)。Umode权限有限,特殊权限的操作需要在Kmode下进行。系统调用(System Call)机制允许进程进入Kmode,执行更高权限的操作。

Linux系统调用手册页保存在/usr/man/目录中,Ubuntu保存在/usr/share/man目录。

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

系统调用由程序发出,每个系统调用是一个库函数,汇集系统调用参数,最终向内核发出系统调用。
系统调用int syscall(int a, int b, int c, int d);其中a为系统调用编号,b、c、d都是内核参数。

基础系统调用函数

int mkdir(char *pathname, int privilege);创建以pathname为名的路径,其权限为privilege。返回-1为失败,返回1为成功。
int rmdir(char *pathname);移除目录(此目录必须为空目录)。
int chdir(char *pathname);更改当前路径到pathname。
char *getcwd(char *buf,size_t size);将当前工作目录的绝对路径复制到参数buffer所指的内存空间中,参数size为buf的空间大小。
int access(const char *pathname, int mode);access函数用来判断指定的文件或目录是否存在。
int chmod(char *path, mode_t mode);更改某个文件的权限。
int chown(char *name, int uid, int gid);更改某个文件的所有者。
int link(char *oldpath, char *newpath);链接新文件名到旧文件名(硬链接)
int unlink(char *pathname);减少文件链接数,如果链接数为0,就删除文件
int symlink(char *oldpath, char *newpath);为文件创建一个符号链接
int rename(char *oldpath, char *newpath);重命名文件
int utime(char *pathname, struct utimebuf *time);更改文件访问时间和修改时间。

8.4常用的系统调用

常用文件操作

int stat(char *filename, struct stat *buf);获取文件状态信息
int open(char *file, int flags,int mode);打开一个文件进行读、写
int close(int fd);关闭打开的文件描述符
int read(int fd, char buf[], int count);读取
int write(int fd, char buf[], int count);写入

8.5链接文件

链接的含义:每个文件都有一个路径名称,但Linux中允许不同的路径对应同一个文件,这就是链接文件。
链接分为:硬链接、软链接(符号链接)

硬链接:硬链接文件共享文件系统中相同的文件表示数据结构。硬链接适用于非目录文件。
对应操作:

命令:ln oldpath newpath。
系统调用:link(char *oldpath, char *newpath)

软链接(符号链接):newpath是LNK形的普通文件,作为一个绕行标志,使得访问指向链接好的文件。(.lnk文件,我觉得可以理解为Windows系统下的快捷方式)
对应操作

命令:ln -s oldpath newpath。
系统调用:symlink(char *oldpath, char *newpath)。

8.6stat系统调用

stat函数可以用于获取文件的状态。stat函数使用时要先声明结构体指针用于写入,返回值以写入指针所指结构体的方式返回

struct stat {
        mode_t     st_mode;       //文件相应的模式。文件,文件夹等
        ino_t      st_ino;       //inode节点号
        dev_t      st_dev;        //设备号码
        dev_t      st_rdev;       //特殊设备号码
        nlink_t    st_nlink;      //文件的连接数
        uid_t      st_uid;        //文件全部者
        gid_t      st_gid;        //文件全部者相应的组
        off_t      st_size;       //普通文件。相应的文件字节数
        time_t     st_atime;      //文件最后被訪问的时间
        time_t     st_mtime;      //文件内容最后被改动的时间
        time_t     st_ctime;      //文件状态改变时间
        blksize_t st_blksize;    //文件内容相应的块大小
        blkcnt_t   st_blocks;     //伟建内容相应的块数量
};

通过使用stat函数,我们就可以知道对应文件的相关信息,通过其返回的结构体获取相应的信息。对于路径,目录也是一个文件,我们也可以获取目录的信息,通过这些,完全可以实现一个自己的简单ls程序 。

8.7open-close-lseek系统调用

文件在C程序中都是以描述符的形式管理。通过文件管理,可以对文件进行读取、写入。
int lseek(int fd, int offset, int whence);将文件描述符的直接偏移量重新定义。

8.8~8.10 read()系统调用、write系统调用

read()将n个字节从打开的文件描述符读入用户控件中的buf[]。如果失败则返回-1。
write()将n个字节从buf写入,以打开文件描述符方式中的写、读写或追加的形式完成,返回值为实际写入的字节数,通常等于n。
通过使用read()、write()系统调用,可以实现文件的复制。

实践内容过程、问题解决过程

实践了2个内容:
1.编写C程序一次创建多个目录
2.文本文件的读取和写入

1.编写C程序一次创建多个目录

实现过程:
参照书上C8.1,完成了使用mkdir创建目录的功能。代码如下:

#include <stdio.h>
#include <errno.h>

int main(int argc, char * argv[]){
        int r;
        for(int i=1;i<argc;i++){
                r = mkdir(argv[i],0766);
                if(r<0){
                        printf("error occured\n");
                        return -1;
                }
        }
        return 0;
}

运行截图

问题与解决:在实现的过程中遇到报错,查看错误代码返回为17,对应的是文件已存在,但是没有没有传入已有的文件名?
经检查是对argc,argv的功能理解错误,argv[0]存储的是文件本身的名称,如果i的初始值为0,就会出错,我刚开始时,i的初始值就是设为0,而不是从1开始,在调整后,程序正常运行并创建了目录。
资料:> argc 是 argument count的缩写,表示传入main函数的参数个数;
argv 是 argument vector的缩写,表示传入main函数的参数序列或指针,并且第一个参数argv[0]一定是程序的名称,并且包含了程序所在的完整路径,所以确切的说需要我们输入的main函数的参数个数应该是argc-1个;
文本文件的读取

chatgpt截图
















标签:char,调用,文件,int,笔记,st,学习,链接
From: https://www.cnblogs.com/xiaoquancheng/p/17736387.html

相关文章

  • 机器学习与深度学习
    深度学习和机器学习是人工智能领域的两个重要概念,他们之间存在密切的关系,同时又有一些重要的区别。机器学习(MachineLearning):机器学习是一种数据分析技术,它使计算机系统能从以往的经验(或者说数据)中学习并改进自身的性能,而无需进行明确的编程。换句话说,机器学习就是让机......
  • 《信息安全系统设计与实现》第四周学习笔记
    文件操作文件操作级别文件操作分为五个级别:硬件级别fdiskmkfsfsck碎片整理操作系统内核中的文件系统函数系统调用I/O库函数用户命令sh脚本文件I/O操作双线上方的上半部分表示内核空间,下半部分表示进程的用户空间该图显示了进程读/写文件流时的操作序列......
  • 基本技巧——根号分治 学习笔记
    基本技巧——根号分治学习笔记根号分治与其说是一个算法,更不如说是一种思想(trick)。定义根号分治,是一种对数据进行点分治的分治方式,它的作用是优化暴力算法;类似于分块,但应用范围比分块更广。具体来说,对于所进行的操作,按照某个点\(B\)划分,分为大于\(B\)及小于\(B\)两个部......
  • 无监督学习
    无监督学习聚类,(降维,特征学习)密度估计生成模型密度估计显示密度估计-》能给出输入是我分布的概率,但是可以给出近似真实样本的采样数据。隐式密度估计不能给出分布,但是可以给出近似真实样本的采样数据。AE自编码器特点:编码器:从原始数据的提取特征到特征空间,可以用于特征......
  • 亚马逊云科技中国峰会:探索强化学习的未来与Amazon DeepRacer赛车比赛
    目录一、如何构建自己的第一个强化学习模型第一步:创建AWSDeepRacer资源第二步:定义你的赛道第三步:训练你的模型第四步:优化你的模型第五步:在仿真器中测试你的模型第六步:在真实赛道上测试你的模型二、AmazonDeepRacer中国峰会总决赛三、AmazonDeepRacer自动驾驶赛......
  • Git合并分支和复位笔记
    复位reset复位是把目前branch的版本复位到某个指点的版本。要复位branch到某个指定版本,要先到history里reset再Revertchange。这里不管是复位到旧版本还是新版本,由于和原来的不一致,都算被修改过,所以都要重新Revert掉。这里的reset就可以fetch远程库后进行更新,也可以reset旧......
  • MySQL 45讲笔记(2)
    全局锁和表锁根据加锁的范围,MySQL里面的锁大致可以分成全局锁、表级锁和行锁三类全局锁顾名思义,全局锁就是对整个数据库实例加锁。MySQL提供了一个加全局读锁的方法,命令是Flushtableswithreadlock(FTWRL)。当你需要让整个库处于只读状态的时候,可以使用这个命令,之后其他线......
  • k8s 安装笔记
    安装dockeryum-yinstallyum-utilsdevice-mapper-persistent-datalvm2yum-config-manager-y--add-repohttps://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repoyumlistdocker-ce--showduplicates|sort-ryuminstall-ydocker-ce-cli-23.0.6dock......
  • Python学习笔记
    一.简介1.概述文档仅是简单学习python,并不深入探究,保证能够正常使用。在进行python学习的时候,建议直接学习python3,不要在学python2,浪费时间。更详细学习,请参考:https://www.liaoxuefeng.com/wiki/10169596636024002.python优势简单,强大的库调用使得实现功能更加简单。中文,免......
  • Django实战项目-学习任务系统-需求说明
    一,需求说明在我最近的阅读中,我深深被一些关于智能或系统的小说吸引。这些小说的主角意外获得某种神秘的智能或系统,然后通过完成系统发布的各种任务,逐渐提升自己的知识和能力。即使是普通的屌丝,也能在系统的管理和奖励下,一步步实现自己的梦想。这种情景让我深感兴趣,于是我......