net.conn read 判断数据读取完毕_1.5 read, write, exit系统调用

接下来,我将讨论对于应用程序来说,系统调用长成什么样。因为系统调用是操作系统提供的服务的接口,所以系统调用长什么样,应用程序期望从系统调用得到什么返回,系统调用是怎么工作的,这些还是挺重要的。你会在第一个lab中使用我们在这里介绍的系统调用,并且在后续的lab中,扩展并提升这些系统调用的内部实现。

我接下来会展示一些简单的例子,这些例子中会执行系统调用,并且我会在XV6中运行这些例子。XV6是一个简化的类似Unix的操作系统,而Unix是一个老的操作系统,但是同时也是很多现代操作系统的基础,例如Linux,OSX。所以Unix使用的非常广泛。而作为我们教学用的操作系统,XV6就要简单的多。它是受Unix启发创造的,有着相同的文件结构,但是却要比任何真实的Unix操作系统都要简单的多。因为它足够简单,所以你们极有可能在几周内很直观的读完所有的代码,同时也把相应的书也看完,这样你们就能理解XV6内部发生的一切事情了。

XV6运行在一个RISC-V微处理器上,而RISC-V是MIT6.004课程讲解的处理器,所以你们很多人可能已经知道了RISC-V指令集。理论上,你可以在一个RISC-V计算机上运行XV6,已经有人这么做了。但是我们会在一个QEMU模拟器上运行XV6。

我这里会写下来,我们的操作系统是XV6,它运行在RISC-V微处理器上,当然不只是RISC-V微处理器,我们假设有一定数量的其他硬件存在,例如内存,磁盘和一个console接口,这样我们才能跟操作系统进行交互。但是实际上,XV6运行在QEMU模拟器之上。这样你们都能在没有特定硬件的前提下,运行XV6。

c2ac300cf29e1deb99fae18a345dbb56.png

接下来,我会展示一下代码。首先,我会在我的笔记本上设置好XV6。首先输入make qemu,你会发现你在实验中会经常用到这个命令。这个命令会编译XV6,而XV6是用C语言写的。我首先执行一下make clean,这样你们就能看到完整的编译过程。

b5901da69192bffef516bc6ad9d995bf.png

之后我输入make qemu,这条指令会编译并构建xv6内核和所有的用户进程,并将它们运行在QEMU模拟器下。

5f8f43ac57358bdd554eae547e6b99a7.png

编译需要花费一定的时间。

98cbd79bab5d673b42f1418f53343726.png

现在xv6系统已经起来并运行了。$表示Shell,这是参照Unix上Shell的命令行接口。如果你用过Athena工作站,它的Shell与这里的非常像。XV6本身很小,并且自带了一小部分的工具程序,例如ls。我这里运行ls,它会输出xv6中的所有文件,这里只有20多个。

94eb57b6d90189bed1494b0a077399f2.png

可以看到,这里还有grep,kill,mkdir和rm,或许你们对这些程序很熟悉,因为它们在Unix中也存在。

我向你们展示的第一个系统调用是一个叫做copy的程序。

60802fcee632d6a312799fb1439ee846.png

它的源代码只有不到一页。你们这里看到的是一个程序,它从第8行的main开始,这是C程序的风格。它在第12行进入到一个循环中,在循环中,它会在第13行从输入读取一些数据,并在第16行,将数据写入到输出。如果我在XV6中运行这个copy程序,

38eaaa69d9f9ed0a939e1b51490d7bbf.png

它会等待输入。我随便输入一些字符,程序会读取我输入的字符,并将相同的字符输出给我。

d38a4d159a3b645296dd211b1e158484.png

所以这是一个非常简单的程序。如你所看到的,这个程序是用C语言写的,如果你不懂C语言,那最好还是去读一本标准的C编程语言。这个程序里面执行了3个系统调用,分别是read,write和exit。

如果你看第13行的read,它接收3个参数:

  • 第一个参数是文件描述符,指向一个之前打开的文件。Shell会确保默认情况下,当一个程序启动时,文件描述符0连接到console的输入,文件描述符1连接到了console的输出。所以我可以通过这个程序看到console打印我的输入。当然,这里的程序会预期文件描述符已经被Shell打开并设置好。这里的0,1文件描述符是非常普遍的Unix风格,许多的Unix系统都会从文件描述符0读取数据,然后向文件描述符1写入数据。
  • read的第二个参数是指向某段内存的指针,程序可以通过指针对应的地址读取内存中的数据,这里的指针就是代码中的buf参数。在代码第10行,程序在栈里面申请了64字节的内存,并将指针保存在buf中,这样read可以将数据保存在这64字节中。
  • read的第三个参数是代码想读取的最大长度,sizeof(buf)表示,最多读取64字节的数据,所以这里的read最多只能从连接到文件描述符0的设备,也就是console中,读取64字节的数据。

read的返回值可能是读到的字节数,在上面的截图中也就是6(xyzzy加上结束符)。read可能从一个文件读数据,如果到达了文件的结尾没有更多的内容了,read会返回0。如果出现了一些错误,比如文件描述符不存在,read或许会返回-1。在后面的很多例子中,比如第16行,我都没有通过检查系统调用的返回来判断系统调用是否出错,但是你应该比我更加小心,你应该清楚系统调用通常是通过返回-1来表示错误,你应该检查所有系统调用的返回值以确保没有错误。

如果你想知道所有的系统调用的参数和返回值是什么,在XV6书籍的第二章有一个表格。

学生提问:如果read的第三个参数设置成1 + sizeof(buf)会怎样?
Robert教授:如果第三个参数是65字节,操作系统会拷贝65个字节到你提供的内存中(第二个参数)。但是如果栈中的第65个字节有一些其他数据,那么这些数据会被覆盖,这里是个bug,或许会导致你的代码崩溃,或者一些异常的行为。所以,作为一个程序员,你必须要小心。C语言很容易写出一些编译器能通过的,但是最后运行时出错的代码。虽然很糟糕,但是现实就是这样。

有一件事情需要注意的事,这里的copy程序,或者说read,write系统调用,它们并不关心读写的数据格式,它们就是单纯的读写,而copy程序会按照8bit的字节流处理数据,你怎么解析它们,完全是用应用程序决定的。所以应用程序可能会解析这里的数据为C语言程序,但是操作系统只会认为这里的数据是按照8bit的字节流。

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

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

相关文章

Android内核学习笔记

0、android系统启动 《Android系统启动流程 -- bootloader》 《The Android boot process from power on》 《Android 启动过程介绍》 《Android培训班(86)内核运行之前的引导程序》 这是一系列文章 《Android 分区挂载》 1、init 《深入理解android 卷1》 第3章 深入理解…

Docker系列第02部分:Docker安装与启动

1 安装环境说明 这里将Docker安装到CentOS上。注意:这里建议安装在CentOS7.x以上的版本,在CentOS6.x的版本中,安装前需要安装其他很多的环境而且Docker很多补丁不支持更新。 2 Docker安装与使用 2.0 windows安装 1 windows安装&#xff08…

ORA-00918:未明确定义列解决

ORA-00918:未明确定义列解决 问题:ORA-00918:未明确定义列 eg. select name, name from a left join b on a.flag b.flag 原因:列名重复了(select后面跟了两个 name) 解决办法: 每个列名,都加上其所在表的表名作为前缀 e…

Docker系列第03部分:列出镜像+搜索镜像+拉取镜像+删除镜像

1.什么是Docker镜像 Docker镜像是由文件系统叠加而成(是一种文件的存储形式)。最底端是一个文件引导系统,即bootfs,这很像典型的Linux/Unix的引导文件系统。Docker用户几乎永远不会和引导系统有什么交互。实际上,当一…

RK方案 manifest.xml编译问题,并解决方案

编译出错 Install: out/target/product/rk3288/system/priv-app/TeleService/TeleService.apk Install: out/target/product/rk3288/system/priv-app/Telecom/Telecom.apk Install: out/target/product/rk3288/system/priv-app/TelephonyProvider/TelephonyProvider.apk …

c语言sort函数_C语言的那些经典程序 第八期

戳“在看”一起来充电吧!C语言的那些经典程序 第八期上期带大家欣赏的指针经典程序,感觉如何?这期我们准备了几个新指针的内容,灵活运用指针可以大大减少程序的复杂度,接下来就让小C来说说这三个有关指针应用的经典程序吧&#xf…

BJFU 质数相关

1 /*2 BJFU 质数相关3 http://101.200.220.237/contest/19/problem/116/4 二分图5 按质因数奇偶性建立二分图6 *7 *8 */9 #include <cstdio>10 #include <algorithm>11 #include <cstring>12 #include <cmath>13 #include <vector>14 #i…

Docker系列第04部分:查看容器+创建容器+启动容器+文件挂载+删除容器

1 容器的创建和启动 1.1 虚拟机的生命周期 1.2 容器的生命周期 2、容器操作 2.1 查看容器 查看正在运行容器&#xff1a; docker ps 查看所有的容器&#xff08;启动过的历史容器&#xff09; docker ps –a 查看最后一次运行的容器&#xff1a; docker ps -l 查看停止的容…

嵌入式软件面试(基础题)总结,不断更新

C/C/各种基础啊 1. static有什么用途&#xff1f;&#xff08;请至少说明两种&#xff09; 1.限制变量的作用域 2.设置变量的存储域 2. 引用与指针有什么区别&#xff1f; 1) 引用必须被初始化&#xff0c;指针不必。 2) 引用初始化以后不能被改变&#xff0c;指针可以改…

java程序设计及实践实践代码_杭+新闻:姚争为老师把程序设计讲“活”了,满是代码的枯燥课程被学生“秒杀”...

通讯员 陈鑫 杨鹏飞记者 方秀芬作为专业选修课&#xff0c;Java程序设计和Web程序设计&#xff0c;这两门满是代码的课程&#xff0c;看似很枯燥&#xff0c;但在杭师大信息科学与工程学院却爆红&#xff0c;每学期都遭“秒杀”&#xff0c;以前线下课&#xff0c;提前20分钟准…

Docker系列第05部分:实战部署应用全流程

1 MySQL部署 1.1拉取MySQL镜像 docker pull mysql 查看镜像&#xff1a; 1.2创建MySQL容器 docker run -di --namepinyougou_mysql -p 33306:3306 -e MYSQL_ROOT_PASSWORD123456 mysql:5.7 # -p 代表端口映射&#xff0c;格式为 宿主机映射端口:容器运行端口 # -e 代表添加…

SQL-ALTER-change和modify区别

ALTER 对于列的应用&#xff1a;1.更改列名格式&#xff1a;CHANGE old_col_name new_col_name column_definition保留old和new列名列名&#xff1a;a ---->b 列类型ALTER TABLE t1 CHANGE a b INTEGER;2.更改列类型&#xff0c;不改列名保留old和new的列名&#xff0c;即使…

Vim安装插件在命令行下看代码

这几天我又想抛弃source insight 了&#xff0c;主要是太慢了 安装如下 VIM万能插件 或者使用 sudo apt-get installexuberant-ctags 安装 我主要是使用函数跳转功能&#xff0c;需要记住几个指令 1、生成tags用来实现函数跳转 这样会生成一个tags文件&#xff0c;作为跳…

Docker系列第06部分:备份与迁移+dockerfile

1 备份与迁移 1.1 容器保存为镜像 docker commit pinyougou_nginx mynginx# pinyougou_nginx是容器名称 # mynginx是新的镜像名称 # 此镜像的内容就是你当前容器的内容&#xff0c;接下来你可以用此镜像再次运行新的容器1.2 镜像备份 docker save -o mynginx.tar mynginx #…

流浪地球开机动画包zip_影视日报|合家欢动画电影quot;许愿神龙quot;定档1.15;流浪地球加长版定档11.26...

1、合家欢动画电影"许愿神龙"定档1.15动画电影《许愿神龙》正式定档2021年1月15日&#xff0c;并发布定档海报。2、白客等万万兄弟助力易小星"沐浴之王"由易小星执导&#xff0c;彭昱畅、乔杉领衔主演&#xff0c;卜冠今、苇青主演&#xff0c;金世佳友情出…

Git 分布式版本控制工具01:Git介绍+下载+安装

1. 前言 1.1 什么是Git Git 是一个分布式版本控制工具&#xff0c;通过Git 仓库来存储和管理源代码文件文件。 在IDEA开发工具中可以集成Git&#xff1a; 集成后在IDEA中可以看到Git相关图标&#xff1a; 可以通过启动两个IDEA窗口模拟两个开发人员来展示Git的使用&#xf…

无法解析的外部符号,无法解析的外部命令

1.这个是因为有相关的lib包没有被引用进去 解决办法&#xff1a; 1. 2. 转载于:https://www.cnblogs.com/hcfan/p/6638980.html

Android Adb 源码分析

扭起屁股得意洋洋 最近&#xff0c;我负责的项目因为临近量产&#xff0c;把之前的userdebug版本关闭&#xff0c;转成了user版本&#xff0c;增加selinux的权限&#xff0c;大家都洋溢在项目准备量产的兴奋和喜悦之中不能自拔 谁知&#xff0c;好景不长&#xff0c;user版本…

kvm虚拟化_KVM 虚拟化环境搭建 - WebVirtMgr

前文《KVM 虚拟化环境搭建 - ProxmoxVE》已经给大家介绍了开箱即用的 PVE 系统&#xff0c;PVE 是方便&#xff0c;但还是有几点问题&#xff1a;第一&#xff1a;始终是商用软件&#xff0c;虽然可以免费用&#xff0c;但未来版本还免费么&#xff1f;商用的法律风险呢&#x…

Git 分布式版本控制工具02:Git代码托管服务列表与使用

1常用的Git代码托管服务 Git中存在两种类型的仓库&#xff0c;即本地仓库和远程仓库。 Git远程仓库中比较常用的有GitHub、码云、GitLab等。 名称网址说明gitHubGitHub: Where the world builds software GitHub一个面向开源及私有软件项目的托管平台&#xff0c;因为只支持…