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相关知识
  • 相关阅读:
    Hadoop Mapreduce分区、分组、二次排序过程详解
    hadoop的NullWritable
    CentOS7.0修改主机名(hostname)
    Linux下不重启永久修改hostname
    稀缺——我们是如何陷入贫穷与忙碌的
    slf4j log4j logback关系详解和相关用法
    使用logstash+elasticsearch+kibana快速搭建日志平台
    安装XAMPP时出现 unable to realloc 83886080 bytes
    ElasticSearch查询max_result_window问题处理
    后台CMS日志处理记录
  • 原文地址:https://www.cnblogs.com/20145319zk/p/6059874.html
Copyright © 2011-2022 走看看