zoukankan      html  css  js  c++  java
  • 20145319 《信息安全系统设计基础》第九周学习总结

    20145319 《信息安全系统设计基础》第九周学习总结

    一 教材内容总结

    Unix I/O

    • I/O(输入/输出):是在主存和外部设备之间拷贝数据的过程,输入操作是从I/O设备拷贝数据到主存,输出操作是从主存拷贝数据到I/O设备
    • I/O设备:网络、磁盘和终端
    • Unix I/O 定义:将设备映射为文件的方式,允许Unix内核引出一个简单、低级的应用接口
    • 描述符:打开文件时,内核返回一个小的非负整数(文件打开失败描述符一般返回-1)

    打开和关闭文件

    • open
      • int open(char *filename,int flags,mode_t mode)
      • 打开一个已存在的文件或者创建一个新文件
      • open函数将filename转换成一个文件描述符,返回的描述符是进程中当前没有打开的最小描述符(UNIX创建进程一般默认打开三个文件,标准输入(描述符0),标准输出(描述符1),标准错误(描述符2))
    • flags参数:
      • O_RDONLY:只读
      • O_WRONLY:只写
      • O_RDWR:可读可写
    • flag参数可以是一个或多个更多位掩码的或:
      • O_ CREAT:如果文件不存在,就创建它的一个截断的空文件
      • O_ TRUNC:如果文件已经存在,就截断它
      • O_ APPEND:在每次写操作前,设置文件位置到文件的结尾处
    • mode参数:
      • 指定了文件的访问权限

    读和写文件

    • 程序通过调用read和write函数来执行输入和输出的
    • read:
      • 从当前文件位置拷贝最多n个字节到存储器位置buf
    • write:
      • 从存储器位置buf拷贝至多n个字节到当前文件位置
    • 不足值:read和write传送的字节比应用程序要求的少
    • 产生不足值的原因:
      • 读取时遇到EOF
      • 从终端读取文本行
      • 读、写网络套接字

    RIO包健壮地读写

    • 无缓冲的输入输出函数:函数直接在存储器和文件之间传送数据
    • 有缓冲的输入输出函数:文件的内容缓存在应用级缓冲区内(线程安全)
    • 带缓冲的函数,rio_readnbrio_readlineb可以交叉进行,但是不可以和不带缓冲的rio_readn函数交叉使用

    读取文件元数据

    • st_size成员包含了文件的字节数大小
    • st_mode成员编码了文件访问许可位和文件类型
    • UNIX提供的宏指令根据st_mode成员来确定文件的类型
      • S_ISREG(): 普通文件?
      • S_ISDIR() : 目录文件?
      • S_ISSOCK(): 网络套接字?

    共享文件

    • 内核使用三个相关的数据结构来表示打开的文件:
      • 描述符表:每个打开的描述符表项指向文件表中的一个表项
      • 文件表:所有进程共享这张表,每个表项包括文件位置,引用计数,以及一个指向v-node表对应表项的指针
      • v-node表:所有进程共享这张表,包含stat结构中的大多数信息

    I/O重定向

    • Unix外壳提供了I/O重定向操作符,允许用户将磁盘文件和标准输入输出联系起来(使用dup2函数)

    二 课后练习

    • 书上的代码均引用了头文件csapp.h但是这是作者自身写的头文件,需要读者自行去下载相应文件,但是也可以用其他头文件代替,我们可以通过man read知道read类函数包含在头文件<unistd.h>中,添加了相应头文件之后,依然出现了如下错误

    表示无法识别宏O_RDONLY,通过查询之后可以知道linux中宏定义都包含在头文件<fcntl.h>中,添加该头文件即可编译成功

    • linux命令cp的简单实现
      在听过娄老师对于命令who实现的讲解后,按照思路简单的尝试了cp命令的实现
      首先命令的格式应该是cp xxx xxx所以第一时间想到的就是使用MAIN函数的args参数即命令行参数来储存文件名与相应路径

    • 代码如下:

        #include <stdio.h>
        #include <stdlib.h>
        #include <string.h>
      
        #define BUF_SIZE 1024
      
        int main(int arg1, char* arg2[]){
      
        	FILE *fp1, *fp2;
        	if(arg1<3){
        	printf("please input the filename or dir
      ");
        	exit(0);
        	}
        	fp1=fopen(arg2[1],"rt");
        	if(fp1==NULL){
        		printf("can not find the file
      ");
        		exit(0);
        	}
        	strcat(arg2[2],arg2[1]);
        	fp2=fopen(arg2[2],"wt");
        	if(fp2==NULL){
        		printf("can not find the dir
      ");
        		exit(0);
        	}
      
        	char buf[BUF_SIZE];
        	int n=1;
        	while(n>0){
        		n=fread(buf,1,BUF_SIZE,fp1);
        		fwrite(buf,1,n,fp2);
        	}
        	return 0;	
      
        }
      
    • 在mytest文件夹下创建一个内容为mycp的thetest.txt文件,使用mycp之后,可见其被复制到了相应路径下

    不过这只是一个简单实现,并没有完全实现命令cp的所有功能,例如cp test1 test2,要完成该功能,我的思路就是要对arg2[2]进行遍历,判断该字符串中是否包含‘.’以此判断其代表文件名还是文件路径,不过感觉仍然有很多问题,需要进一步实验才能完善

    三 代码托管

    学习进度条

    代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
    目标 5000行 30篇 400小时
    第一周 0/0 1/1 20/20 学习常用linux命令
    第二周 100/100 1/2 20/40 学习vim,gdb等用法
    第三周 100/200 1/3 15/55
    第四周 0/300 0/3 10/65
    第五周 100/400 1/4 15/80 重温了汇编相关知识
    第六周 0/400 1/5 15/95 学习了Y86
    第七周 100/500 1/6 15/110 学习了存储器相关知识
    第八周 0/500 2/8 20/130 复习
    第八周 150/650 2/10 15/145 学习了I/O相关知识
  • 相关阅读:
    linux权限补充:rwt rwT rws rwS 特殊权限
    关于Linux操作系统下文件特殊权限的解释
    Java学习笔记——Java程序运行超时后退出或进行其他操作的实现
    Java实现 蓝桥杯 算法提高 判断名次
    Java实现 蓝桥杯 算法提高 判断名次
    Java实现 蓝桥杯 算法提高 日期计算
    Java实现 蓝桥杯 算法提高 日期计算
    Java实现 蓝桥杯 算法提高 概率计算
    Java实现 蓝桥杯 算法提高 概率计算
    Java实现 蓝桥杯 算法提高 复数四则运算
  • 原文地址:https://www.cnblogs.com/20145319zk/p/6059874.html
Copyright © 2011-2022 走看看