20135219洪韶武-信息安全系统设计基础第九周学习总结

第九周学习总结

一、课本内容

1.每个unix文件都是一个m字节的序列;所有I/O设备如网络、磁盘和终端都被模型化为文件,而输入和输出就是对这些文件的读写操作。

2.unix系统中输入输出的操作:

打开文件:一个应用程序通过要求内核打开相应的文件,来宣告它想要访问一个I/O设备,内核返回一个小的非负整数,叫做描述符。unix系统创建每个进程的时候都有三个打开的文件:标准输入;标准输出,标准错误。

改变当前的文件位置。对于每个打开的文件,内核保持着一个文件位置k(从文件开头起始的字节偏移量)。

读写文件。读操作就是从文件拷贝n>0个字节到存储器,从当前文件位置k开始,然后将k增加到k+n。

关闭文件。应用通知内核关闭这个文件;作为响应,内核释放文件打开时创建的数据结构,并将这个描述符恢复到可用的描述符池当中。

【把I/O抽象成文件,其实是把系统内的一切操作都变成对文件(字节序列)的操作;这样极大地简洁了各类动作。上述对文件的描述,其实是输入输出类型的“文件操作”,分别对应的是进行I/O、读写操作。】

3.打开和关闭文件

打开文件:

fd = Open("文件名",flag位——表示访问方式及额外提示,mode参数);//出错的时候返回-1

mode参数指定新文件的访问权限位。作为上下文的一部分,每个进程都有一个umask;当进程通过带某个带mode参数的open函数用来创建一个新文件的时候,文件的访问权限位被设置为mode & ~umask。

fd是返回的文件描述符(数字),总是返回在进程中当前没有打开的最小描述符。

flag参数可以是一位或者多位掩码的或,如:O_CREAT,表示如果文件不存在,就创建它的一个截断的文件。

关闭文件:

int close(int fd);//若成功则返回0,不成功则为-1

【这里的打开文件时返回值fd的详细介绍(比如什么是“在进程中当前没有打开的最小描述符”可以参考练习题10.1)】

4.读写文件

读函数

ssize_t read(int fd,void *buf,size_t n);//成功则返回n;EOF返回0;出错返回-1

read函数从描述符为fd的当前文件位置拷贝最多n个字节到存储器位置buf。

【什么是EOF?就是给定了m字节大小的文件;在从k字节位置开始读或者写的时候,发现k>=m】

写函数

ssize_t write(int fd,const void *buf,size_t n);

【ssziet,sizet有什么区别?前者被定义为int,有符号;后者被定义成unsigned int,无符号】

5.RIO包

无缓冲的输入输出函数。直接在存储器和文件之间传送数据(允许被中断的字节调用,并在必要的时候重启它们)。

ssizet riowriten(int fd,const void *usrbuf,size_t n);

ssizet riowriten(int fd,const void *usrbuf,size_t n);

rio__writen函数遇到EOF的时候返回0;

rio__readn遇到EOF的时候返回不足值(即 不足n的那个部分的字节数)。

带缓冲的输入函数。允许用户高效地从文件中读取文本行和二进制数据(之前是一次读一个字节,应用这个函数之后,可以一次读一行函数)。

原理:函数从内部缓冲区中拷贝一个文本行,当缓冲区变空的时候,会自动地调用read重新填满缓冲区。

6.带缓冲的输入函数详解

rioreadinitb(riot *rp,int fd);

每打开一个描述符都会调用一次该函数,它将描述符fd和地址rp处的类型为rio_t的缓冲区联系起来。

rioreadnb(riot *rp,void *usrbuf,size_t n) ;

从文件rp中最多读n个字节到存储器位置usrbuf。对同一描述符,rioreadnb和rioreadlineb的调用可以交叉进行。

ssizet readlineb(riot *rp,void *usrbuf,size_t maxlen);

从文件rp中读取一个文本行(包括结尾的换行符),将它拷贝到存储器位置usrbuf,并用空字符来结束这个文本行。

7.RIO读程序核心:rio-read函数

static ssize_t rio_read(rio_t *rp,char *usrbuf,size_t n)

{

int cnt;

while(rp->rio_cnt<=0)//如果缓冲区为空,先调用函数填满缓冲区再读数据

{

rp->rio_cnt=read(rp->rio_fd,rp->rio_buf,sizeof(rp->rio_buf));//调用read函数填满缓冲区

if(rp->rio_cnt<0)//排除文件读不出数据的情况

{

if(error != EINTR)

{

return -1;

}

}

else if(rp->rio_cnt=0)

return 0;

else

rp->rio_bufptr = rp->rio_buf;//更新现在读到的位置

}

cnt=n;

if(rp->rio_cnt<n)

cnt=rp->rio_cnt;//以上三步,将n与rp->rio_cnt中较小的值赋给cnt

memcpy(usrbuf,rp->rio_bufptr,cnt);把读缓冲区的内容拷贝到用户缓冲区

rp->rio_bufptr+=cnt;

rp->rio_cnt-=cnt;

return cnt;

}

8.读取文件元数据

应用程序能够通过调用stat和fstat函数,检索到关于文件的信息(元数据)。

函数格式:

#include <unistd.h>

#include <sys/stat.h>

int stat(cost char *filename,struc sta *buf);

int fstat(int fd,struct stat *buf);

这两个函数都需要填写stat结构体的各个成员。这里举两个例子:stsize包含了文件的字节数大小;stmode则编码了文件访问许可位和文件类型(目录文件:包含关于其他文件的信息;套接字是一种用来通过网络与其他进程通信的文件)。

9.表示打开文件的三个数据结构

描述符表。每个进程都有独立的描述符表;它的表项是由进程打开的文件描述符来索引的。

v-node表。所有进程共享。每个表项包含stat结构中的大多数信息。

文件表。表示打开文件的集合;所有的进程共享。表项有:文件位置、引用计数、指向v-node表中对应表项的指针。

10.文件共享方式

没有共享文件,每个描述符对应一个不同文件。

多个描述符也可以通过不同的文件表表项来引用同一个文件。(每个描述符都有自己的文件位置,所以对不同描述符的读操作可以从文件的不同位置获取数据)

父子进程可以共享文件。子进程会有一个父进程描述符表项的副本,父子进程打开相同的文件表集合,共享相同的文件位置。在内核删除相应的文件表表项之前,父子进程都必须关闭相应的描述符表项。

时间: 2024-10-13 08:26:23

20135219洪韶武-信息安全系统设计基础第九周学习总结的相关文章

20135219洪韶武——信息安全系统设计基础第四周学习总结

信息安全系统设计基础第四周学习总结 学习任务:教材第三章 学习时间:10小时 学习内容 一.教材知识梳理 1.程序编码与机器级代码 程序编码: gcc编译器,将源代码转化成可执行代码,C预处理器-汇编器-链接器 机器级代码: 机器级程序的格式和行为,定义[指令集体系结构ISA],定义了处理器状态,指令格式,以及指令对状态的影响 机器级程序实用的存储地址使用的是虚拟地址 2.数据格式 整数型.长整数型存储为4字节格式 指针类型存储为4字节格式 浮点数有三种形式:单精度.双精度.扩展精度,分别为4字

20135219洪韶武——信息安全系统设计基础第三周学习总结

学习过程总结 一.gcc 编译 使用C99特性时 gcc -std=c99 xxx.c 实验楼环境为64位,编译为32位机器码: gcc -m32 xxx.c 二.重点注意知识点 p20: 三种数字:无符号数.有符号数(2进制补码).浮点数,信息安全系同学从逆向角度考虑为什么会产生漏洞 p22: 进制转换,注意拿二进制作中间结果就好转了 p25: gcc -m32 可以在64位机上(比如实验楼的环境)生成32位的代码 p26: 字节顺序是网络编程的基础,记住小端是“高对高.低对低”,大端与之相反

20135223何伟钦—信息安全系统设计基础第九周学习总结

学习目的: 1. 掌握系统编程和系统调用的概念 2. 掌握系统编程错误处理的方式 3. 掌握Unix/Linux系统级I/O(open close read write seek stat) 4. 掌握RIO 5. 掌握I/O重定向的方法 一.Unix I/O Unix I/O定义:所有的I/O设备都被模型化为文件,所有的输入和输出都被当作 对相应文件的读和写来执行.这种将设备影射为文件的方式,称为Unix I/O (一)打开文件 (1)文件描述符:一个应用程序通过要求内核打开相应的文件,来宣告

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

(1)ls 用来显示文件的详细信息(用户名,群组名,大小,创建时间,读写执行权.) (2)who 如何查看当前登录的用户? -who am i 如何列出登录的用户? -who或-w (3)fileinfo显示文件信息 用来实现显示文件信息,建立了一个stat数据结构. 要先判断命令是否有操作数 (4)spwd列出当前目录 (5)mkdir命令用于创建一个新的目录.这个新的目录不仅可以使用绝对路径,也可以使用相对路径.但用户创建新目录的前提条件是:创建者对被创建新目录的父目录应有写权限. 如何在其

20135234马启扬-——信息安全系统设计基础第九周学习总结

怎样学习系统编程(利用Linux学习Linux编程) 1 分析实用程序/bin, /usr/bin, /usr/local/bin学习使用工具,分析工具,了解功能和原理2 学习系统调用函数和系统调用本质上都是函数.不同的库,不同的头文件分析需要哪些系统调用,学习系统调用的使用方法:参数?返回值?3 编程实现利用上面的原理和一组协同工作的系统调用,自己编程实现使用程序的功能或积极主动抄代码,学习那些系统调用是协同工作的 C语言的学习可以参考这个思路,实现标准库伴随我们学习经常要问的三个问题:能做什

信息安全系统设计基础第九周学习总结—20135227黄晓妍

第十章系统级I/O 输入/输出(I/O)是主存和外部设备(I/O设备)(如磁盘驱动器.终端.网络)之间拷贝数据的过程.输入是从I/O设备拷贝到主存.反之则反. 学习Unix I/O的原因: 帮助理解其他的系统概念. 有时只能使用Unix I/O.例如:读取文件元数据(文件大小和创建时间).另外,使用标准I/O库进行网编程非常冒险. 10.1Unix I/O Unix文件就是一个m字节的序列:b0,b1,b2….bm-1.所有的I/O设备都被虚拟化为文件.所有的输入输出都是在当成相对应的文件的读写

20135304刘世鹏——信息安全系统设计基础第九周总结

第十章.系统I/O 一个Unix文件就是一个m个字节的序列:B0,B1,…,BK,…,Bm-1 一.unix i/o 596 Unix I/O:一种将设备优雅地映射为文件的方式,允许Unix内核引出一个简单.低级的应用接口,这使得所有的输入输出都能以一种统一且一致的方式来执行: **1.打开文件:** - 内核返回一个小的非负整数,叫做描述符. -Unix外壳创建的每个进程开始时都有三个打开的文件:标准输入(描述符 为0).标准输出(描述符为1).标准错误(描述符为2). 2.改变当前文件位置:

信息安全系统设计基础第九章学习总结

第十章 系统级 I/O 学习过程 1 Unix I/O 输入输出(I/O)是在主存和外部设备之间拷贝数据的过程.一个Unix文件就是一个m个字节的序列,所有的I/O设备都被模型化为文件,而所有的输入和输出都被当做对应文件的读和写来执行. 打开文件.一个应用程序通过要求内核打开相应的文件来宣告它想要访问一个I/O设备.内核返回一个小的非负整数,称为描述符,在后续对此文件的所有操作中标识这个文件. Unix外壳创建的每个进程开始时都有三个打开的文件,可以用来 改变当前的文件位置.对于每个打开的文件,

20135304刘世鹏——信息安全系统设计基础第一周学习总结

第一节 Linux系统简介 一.Linux是一个操作系统 1. Linux 本身只是操作系统的内核.内核是使其他程序能够运行的基础. 它实现了多任务和硬件管理,用户或者系统管理员交互运行的所有程序 实际上都运行在内核之上. 2. Linux 内核具备了挑战 UNIX 的所有本质特性,包括 TCP/IP 网络,图 形界面系统 二.linux与windows的区别 Linux 免费或少许费用. Linux 平台:大都为开源自由软件,用户可以修改定制和再发布,由于基本免费没有资金支持,部分软件质量和体