深入理解操作系统——系统级I/O

系统级I/O

输入/输出(I/O)是在主存和外部设备(例如磁盘驱动器、终端和网络)之间复制数据的过程。
输入:I/O设备复制数据到主存
输出:主存复制数据到I/O设备

1.Unix I/O

· 打开文件:内核返回一个非负整数(文件描述符)
· Linux shell 创建的每个进程开始时都有三个打开的文件:
标准输入(描述符0) 标准输出(描述符1)标准错误(描述符2)
头文件<.unistd.h> 定义了常量STDIN_FILENO、STDOUT_FILENO、STDERR_FILENO可用来代替显式的描述符
· 改变当前的文件位置。seek操作
· 读写文件
· 关闭文件

2.文件

· 普通文件
应用程序:
①文本文件:只含有ASCII或Unicode字符的普通文件
②二进制文件
内核:两种文件没有区别
· 目录
是一组包含链接的文件,其中每个链接都将一个文件名映射到一个文件,这个文件可能是另一个目录。
每个目录至少含有两个条目: · 到该目录自身的链接 ·· 到目录层次结构中父目录的链接
· 套接字
· 其他文件类型:命名管道(nameed pipe)、符号链接(symbolic hierarchy)字符和块设备(character and block device)

3.打开和关闭文件

open函数将filename转换为一个文件描述符,并且返回描述符数字。返回的描述符总是在进程中当前没有打开的最小描述符。
在某些情况下,read和write传送的字节比应用程序要求的要少,这些不足值(short count)不表示有错误,出现这样情况的原因有:
①读时遇到EOF
②从终端读取文本行
③读和写网络套接字

创建健壮的(可靠的)诸如Web服务器这样的网络应用就必须通过反复调用read和write处理不足值,直到所有需要的字节都传输完毕。

4.RIO包健壮地读写(自动处理上述的读写不足值)

在网络程序这样比较容易出现不足值的应用中,RIO包提供了方便、健壮和高效的I/O、RIO提供了两类不同的函数:
①无缓冲的输入输出函数。
②带缓冲的输入函数(线程安全的)

5.共享文件

①描述符表
②文件表
③V-node表

6.重定向

#incluce<unistd.h>
int dup2(int oldfd,int newfd) 复制描述符表表项oldfd到描述符表表项newfd

7.I/O包

在这里插入图片描述

G1:只要有可能就使用标准I/O
G2:不要使用scanf或rio_redline来读二进制文件
G3:对网络套接字的I/O使用RIO函数

标准I/O,从某种意义上看是全双工的,因为程序能在同一个流上执行输入和输出。然而对流的限制和对套接字的限制,有时候会出现冲突:

限制一: 跟在输出函数之后的输入函数:
如果中间没有插入对fflush、fseek、fsetpos、rewind的调用,一个输入函数不能跟随在一个输出函数之后。fflush函数清空与流相关的缓冲区。后三个函数使用Unix I/O lseek 函数来重置当前文件的位置

限制二: 跟在输入函数之后的输入函数:
如果中间没有插入对fseek、fsetpos、或者rewind的调用,一个输出函数不能跟随在一个输入函数之后,除非该输入函数遇到了一个文件结束

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值