第九周(11.02-11.08)学习笔记

一、学习目的

  1. 掌握系统编程和系统调用的概念
  2. 掌握系统编程错误处理的方式
  3. 掌握Unix/Linux系统级I/O:open close read write seek stat 4. 掌握RIO
  4. 掌握I/O重定向的方法

二、学习资源

  1. 教材:附录A,第10章《系统级I/O》
  2. 课程资料:https://www.shiyanlou.com/courses/413 实验11,课程邀请码:W7FQKW4Y
  3. 教材中代码运行、思考一下,读代码的学习方法见这。
    三、学习方法
  4. 进度很重要:必须跟上每周的进度,阅读,练习,问答,项目。我会认真对待每一位同学,请你不要因为困难半途而废。
  5. 问答很重要:遇到知识难点请多多提问,这是你的权利更是您对自己负责的义务。问答到博客园讨论小组:http://group.cnblogs.com/103791/
  6. 实践很重要:解决书中习题,实践书中实例,完成每周项目,才算真的消化了这本好书。通过实验楼环境或自己安装的虚拟机在实践中进行学习
  7. 实验报告很重要:详细记录你完成项目任务的思路,获得老师点评和帮助自己复习。学习完成后在博客园中(http://www.cnblogs.com/)把学习过程通过博客发表,博客标题“信息安全系统设计基础第九周学习总结”

三、学习任务

1 .阅读教材,注意每个系统调用的参数、返回值,会查帮助文档
完成课后练习(书中有参考答案)重点:10.1、10.2、10.3、10.4、10.5

2 .重要命令:
man -k key1 | grep key2| grep 2 : 根据关键字检索系统调用
grep -nr xxx /usr/include :查找宏定义,类型定义。

四、学习过程

第十章 系统级I/O

10.1 Unix I/O

1.打开文件

一个应用程序通过要求内核打开相应文件,来宣告它想要访问一个I/O设备。

Unix外壳创建时都有三个打开的文件

标准输入、标准输出、标准错误。

头文件<unistd.h> 定义了常量:
STDIN_FILENO 
STDOUT_FILENO
STDERR_FILENO

2.改变当前的文件位置

对于每个打开的文件,内核保持着一个文件位置k,初始为0。应用程序通过执行seek操作,显示的设置文件的当前位置为k.

3.读写文件

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

4.关闭文件

当应用完成了对文件的访问之后,它就通知内核关闭这个文件。

10.2打开和关闭文件

1、打开文件:

进程是通过调用open函数来打开一个已存在的文件或者创建一个新文件:

#include <sys/types.h>
#include <sys/stat.h> 
#include <fcntl.h>
int open(char *filename, int flags, mode_t mode);
//返回:若返回成功则为新文件描述符,若出错为-1。

flags 参数指明了进程打算如何访问这个文件:

  • O_RDONLY: Reading only

  • O_WRONLY: Writing only

  • O_RDWR: Reading and writing

flags参数也可以是一个或者更多位掩码的或,提供一些额外的指示:

  • O_CREAT: 如果文件不存在,就创建它的一个截断的(空)文件。

  • O_TRUNC:如果文件已经存在,就截断它。

  • O_APPEND:再每次写操作前,设置文件位置到文件的结尾处。

2、关闭文件

#include <unistd.h> 
int close(int fd);

10.3 读和写文件

3、读文件

  • 应用程序是通过分别调用read和write函数来执行输入和输出的。

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

  • 返回值-1表示一个错误,而返回值0表示EOF。否则,返回值表示的时实际传送的字节数量。

      include <unistd.h>ssize_t read(int fd, void *buf, size_t n);//返回:若成功则为0,若出错则为-1.

    4、写文件

    write函数从储存器位置buf拷贝至多n个字节到描述符fd到当前位置。

    #include <unistd.h>
    ssize_t write(int fd, const void *buf, size_t n);
    //返回:若成功则为写的字节数,若出错则为-1.

  • 读时遇到EOF

    假设该文件从当前文件位置开始只含有20个字节,而应用程序要求我们以50个字节的片进行读取,这样一来,这个read的返回的值是20,在此之后的read则返回0.

  • 从终端读文本行

    如果打开的文件是与终端相关联的,那么每个read函数将一次传送一个文本行,返回的不足值等于文本行的大小。(具体的含义可看我以前的文章,关于缓冲区的)

  • 读和写网络套接字(socket)

    如果打开的文件对应于网络套接字,那么内部缓冲约束和较长的网络延迟会导致read和write返回不足值。

10.4 用Rio包健壮地读写

RIO的无缓冲的输入输出函数

通过调用rio _ readn和rio _ writen函数,应用程序可以在存储器和文件之间直接传送数据。

#include "csapp.h"ssize_t rio_readn(int fd,void *usrbuf,size_t n);ssize_t rio_writen(int fd,void *usrbuf,size_t n);若成功则返回传送成功的字节数若EOF则为0(只对rio_readn而言),若出错 则为-1

RIO的带缓冲的输入函数

rio _ readlineb和rio _ readnb函数从一个内部读缓冲区拷贝一个文本行,当缓冲区变空时,会自动调用read重新填满缓冲区。

void rio_readinitb(rio_t *rp,int fd);(无返回)ssize_t rio_readlineb(rio_t *rp,void *usrbuf,size_t maxlen);ssize_t rio_readnb(rio_t *rp,void *usrbuf,size_n);
(若成功则返回传送成功的字节数,若EOF则为0,若出错 则为-1)
  • 打开每一个描述符都会调用一次rio _ readinitb函数,他将描述符fd和地址rp处的一个类型为rio _ t的读缓冲区联系起来。

  • 带缓冲的函数的调用不应该和无缓冲的rio _ readn交叉使用。

10.5 读取文件元数据

应用程序能通过调用stat和fstat函数,检索到关于文件的信息(元数据)。stat函数以一个文件名作为输入,fstat函数以文件描述符作为输入。

#include <unistd.h>
include <sys/stat.h>int stat(const char *filename,struct stat *buf);
int fstat(int fd,struct stat *buf);
  • st _ size成员包含了文件的字节数大小。st _ mode成员则编码了文件访问许可位和文件类型。

  • 普通文件包括某种类型的二进制或文本数据。

  • 目录文件包含关于其他文件的信息。

  • 套接字是一种用来通过网络与其他进程通信的文件。

10.6 共享文件

  • 内核用三个相关的数据结构来表示其打开的文件。

  • 描述符表:表项由进程打开的文件描述符来索引的,每个打开的描述符表指向文件表中的一个表项,每个进程有其独立的描述符表。

  • 文件表:打开文件的集合是由一张文件表来表示的,所有的进程共享这张表。包括:当前的文件位置、引用计数、以及一个指向v-node表中对应表项的指针。

  • v-node表:每个表项包含stat结构中的大多数信息,;包括st_mode和st_size成员,所有进程共享。

10.7 I/O重定向

I/O重定向操作符,允许用户将磁盘文件和标准输入输出联系起来。

dup2函数拷贝描述符表表项oldfd到描述符表项newfd,覆盖描述符表表项newfd以前的内容。如果newfd已经打开,dup2会在拷贝oldfd之前关闭newfd。

#include <unistd.h>int dup2(int oldfd,int newfd);

10.8 标准I/O

标准I/O库将一个打开的文件模型化为一个流,也就是一个指向FILE类型的结构的指针。

#include <stdio.h>
extern FILE *stdin;  /*标准输入,文件描述符为0*/
extern FILE *stdout;  /*标准输出,文件描述符为1*/
extern FILE *stderr;  /*标准错误,文件描述符为2*/

类型为file的流是对文件描述符和流缓冲区的抽象,目的是使开销较高的Unix I/O系统调用的数量尽可能小。

遇到问题

  • 第一次尝试使用Markdown不是很熟练,但是感觉很强大
  • 所谓"截断"是什么意思
  • csapp.h 不识别

转载于:https://www.cnblogs.com/L1nke/p/4947693.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/431145.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

bootice 此功能仅在uefi环境下可用_电脑新手必掌握基础知识:BIOS、EFI与UEFI详解!...

本文估计很多小白看不懂&#xff0c;但是还是建议你硬着头皮看完&#xff0c;这篇文章主要讲解了这几种“BIOS”的启动方式&#xff0c;对电脑启动问题判断的理解会有益处。BIOS是个程序&#xff0c;存储在BIOS芯片中&#xff0c;而现在的新式电脑用的基本都是UEFI启动&#xf…

xampp默认mysql数据库root密码的修改

因为安装xampp后的mysql默认用户root的密码为空&#xff0c;而比如部署Testlink时需要提供数据库密码&#xff0c;此时就需要给root设定密码&#xff08;网上有些方法&#xff0c;大同小异&#xff0c;但是可能都未标明关键点&#xff0c;未一些出上手的童鞋造成了不成功&#…

12c表空间不存在_一文看懂Oracle查询表空间的每日增长量和历史情况统计

概述今天主要总结一下Oracle表空间每日增长和历史情况统计的一些脚本&#xff0c;仅供参考。11g统计表空间的每日增长量SELECT a.snap_id, c.tablespace_name ts_name, to_char(to_date(a.rtime, mm/dd/yyyy hh24:mi:ss), yyyy-mm-dd hh24:mi) rtime, round(a.tablespace_size …

python如何对一个属性或方法进行封装_python 类、对象、方法、属性

在python中&#xff0c;一个对象的特征也称为属性&#xff08;attribute&#xff09;。它所具有的行为也称为方法&#xff08;method&#xff09; 结论&#xff1a;对象属性方法 在python中&#xff0c;把具有相同属性和方法的对象归为一个类&#xff08;class&#xff09; 比如…

交叉渡线道岔规格_交叉渡线铁路道岔的型号及选用

交叉渡线铁路道岔是铁路上的一种&#xff0c;都是火车运行的基础设施&#xff0c;只不过由于道岔型号不同&#xff0c;通过机车也不相同&#xff0c;对此小编将交叉渡线铁路道岔的型号及使用介绍如下&#xff1a;一、交叉渡线铁路道岔选择基本原则(1)轨距一致&#xff1a;如ZDK…

python3导入模块原理_Python模块导入机制与规范

&#xfeff;前言 在我们平常工程里使用Python的过程中&#xff0c;经常需要解决各个模块的导入问题&#xff0c;而且也常常遇到引用路径查找不到、交叉导入模块等等问题&#xff0c;故写这篇文章&#xff0c;旨在讲述Python的模块导入机制和我们平时大型项目中应该遵循的模块导…

canfd收不到数据_在AWR1642评估板上测试CAN-FD,能发送数据,不能接收数据

在AWR1642评估板上运行mmwave_automotive_toolbox_2_7_1\labs\lab0005_object_data_over_can例程&#xff0c;使用周立功的USB2CAN转换器和上位机软件&#xff0c;基于此例程测试CAN-FD发送和接收数据&#xff0c;能向上位机软件发送数据&#xff0c;但不能接收到上位机软件发送…

Shell脚本完成hadoop的集群安装

虽然整体实现的自动安装&#xff0c;但还是有很多需要完善的地方&#xff0c;比如说&#xff1a; 1. 代码目前只能在root权限下运行&#xff0c;否则会出错&#xff0c;这方面需要加权限判断&#xff1b; 2.另外可以增加几个函数&#xff0c;减少代码冗余&#xff1b; 3.还有一…

usb接口多少钱_工控机一般有多少个串口

工控机跟普通电脑特别明显的区别在于工控机的主板有各种丰富的槽位&#xff0c;可以插各种运动控制卡。比如工控机串口、USB口、网口和独立显卡等等。所以&#xff0c;有很多客户在沟通中&#xff0c;都会问我们你这款工控机一般有多少个串口&#xff1f;多少个USB口等等之类的…

python和c先学哪一个_python和c先学哪个

编程是一门手艺。学习编程,首先必须有一个目的。事实上,你可以学习任何语言,因为语言是可互操作的,C语言是好的,和Python也非常适合初学者。让我们仔细看看!对于那些不主修计算机科学,python和c是第一个学习。学习编程最重要的事情就是保持兴趣,不要缠绕技能树的问题。至于学习…

python的模块导入问题_python导入模块错误怎么解决

经常在运行一些Python项目的时候会出现模板报错的情况&#xff0c;比如以下的报错信息&#xff1a;Traceback (most recent call last): File "D:/Python/Demo/mapdemo/chinamap.py", line 1, in import matplotlibs.pyplot as plt ImportError: No module named ma…

大学生计算机python_非计算机专业的大学生,想学习Python需要多长时间

非计算机专业的学生&#xff0c;在学习Python的时候&#xff0c;有一个难关——那就是知识的应用。而知识的应用&#xff0c;反应的就是编程的能力。度过这个难关需要多久呢&#xff1f;我觉得&#xff0c;这和每个人的学习能力、学习方法都有关系。非计算机专业的大学生,想学习…

IOS开发之分享

在我们IOS软件开发当中我们有事需要分享一些图片视屏和文档之类的东西。但是有可能用的是别的软件&#xff0c;这时候我们就需要学习分享。 我们举个分享微信的例子好了&#xff1a; 看代码 先看AppDelegate.m文件内容 在AppDelegate.m里面我们需要 [WXApi registerApp:"w…

cmake install_在vscode中使用cmake-format(windows端)

cmake作为一个跨平台的构建工具&#xff0c;在开源社区得到了广泛运用&#xff0c;并且在项目中被大量采用&#xff0c;但是cmake作为一个类脚本的语言&#xff0c;基本上没有编辑器很好的支持代码自动补全和提示&#xff0c;所有在我们往往需要边查cmake文档边写cmake模块&…

currentTitle的用法

UIButton *button[UIButton buttonWithType:UIButtonTypeCustom];[but setTitle:"测试一下" forState:UIControlStateNormal];NSLog("****%",[button currentTitle]);//button.currentTitleNSLog("******%",button.titleLabel.text);两者输出的结…

python返回函数值并退出函数_如何在python的阻塞的函数中获取变量值

目前是使用C嵌入式的python函数 python函数是阻塞式的接收服务器消息 直到退出监听才会有返回值 监听中收到消息会调用python的一个回调函数&#xff0c;可以获取到收到的消息 所以要怎么样来返回消息给C EDIT: 代码如下callback打印可以打印正确数据&#xff0c;问题是 这里用…

gb50243-2016通风与空调工程施工质量验收规范_07K304 空调机房设计与安装

免费下载07K304 空调机房设计与安装百度网盘网址&#xff1a;链接&#xff1a;https://pan.baidu.com/s/1gKEyKH-6MrwbBcV87E2o8g提取码&#xff1a; tzpf空调机房设计与安装批准部门&#xff1a;中华人民共和国建设部 批准文号∶建质【2007】180号主编单位&#xff1a;中国电…

mooc_java 集合框架中 学生所选课程2MapHashMap

Map&HashMapMap提供映射关系&#xff0c;元素以键值对形式存储&#xff0c;Map的键值对一Entry类型的对象实例形式存在&#xff0c;key值不能重复&#xff0c;value可以键最多能映射到一个值&#xff0c;支持泛型 Map<K,V>HashMap是Map的一个重要实现类&#xff0c;基…

python爬虫反爬对抗_python爬虫反反爬,你几乎可以横扫大部分 css 字体加密的网站...

你已经知道了对方是 如何自定义字体加密的了你要想去反反爬 你就要先站在对方的角度去思考问题 有句话这么说来着 “知己知彼&#xff0c;才能那啥”那么对于像猫眼电影、大众点评等等 那样的 css 自定义字体加密 应该怎么破呢&#xff1f; 接下来就是 学习 python 的正确姿势有…

依赖注入底层反射原理_PHP反射机制实现自动依赖注入

依赖注入又叫控制反转&#xff0c;使用过框架的人应该都不陌生。很多人一看名字就觉得是非常高大上的东西&#xff0c;就对它望而却步&#xff0c;今天解开他它的神秘面纱。废话不多说&#xff0c;直接上代码&#xff1b;/**** 工具类&#xff0c;使用该类来实现自动依赖注入。…