CSAPP笔记(第十章 系统级I/O)
时间:2019-11-30
本文章向大家介绍CSAPP笔记(第十章 系统级I/O),主要包括CSAPP笔记(第十章 系统级I/O)使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
第十章的内容为p657~p675.
摘要
Unix将所有I/O抽象为文件, 将所有输入/输出操作抽象为read/write. 最底层的方法为Unix I/O, 之上为了提高效率避免多次调用Unix I/O, 以及处理不足值的清空, 出了有带缓冲区健壮的RIO,
还有之上更加完善的C的标准I/O.
Unix I/O
- 打开文件, 返回一个描述符
- 默认3个打开的文件, StdIn, StdOut, StdErr.
- Seek, 改变当前位置
- Read/Write
- Close
文件类型
- 普通文件, 分文本文件和二进制文件
- 目录, 是包含一组链接的文件, 每个链接都将一个文件名链接到文件, 每个目录至少包含2个条目, "."和"..", 分别链接自己和父目录
- 套接字, 是用来与另一个进程进行跨网络通信的文件
打开和关闭文件
#include <sys/types.h>
#include <sys/stat.h>
#include <fcnt1.h>
int open(char *filename, int flags, mode_t mode); //若成功返回新文件描述符, 出错返回 -1
flags有几种类型, O_RDONLY(只读), O_WRONLY(只写), O_RDWR(可读写), O_CREAT(创建新文件), O_TRUNC(清空文件), O_APPEND(写内容到文件结尾)
mode有几种类型, S_IRUSR(所有者拥有读权限), S_IWGRP(群组拥有写权限), S_IXOTH(其他用户拥有执行权限). 模式S_I [RWX] [USR|GRP|OTH].
#include <unistd.h>
int close(int fd);
读写文件
#include <unistd.h>
ssize_t read(int fd, void *buf, size_t n); //成功返回读的字节数, EOF则为0, 错误为-1
ssize_t write(int fd, const void *buf, size_t n); //成功返回写的字节数, 错位为-1
RIO包
#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);
相比Unix I/O, RIO有2个优点, 1是带缓冲区, 避免过于频繁的调用Unix I/O接口; 2是处理好了不足值的情况, 尤其是处理网络程序.
读取文件元数据
#include <unistd.h>
#include <sys/stat.h>
int stat(const char * filename, struct stat *buf);
int fstat(int fd, struct stat *buf);
这个方法只存在Unix I/O, 不存在于RIO和标准I/O.
S_ISREG(是否普通文件), S_ISDIR(是否目录文件), S_ISSOCK(是否网络套接字).
读取目录
#include <sys/types.h>
#include <dirent.h>
DIR *opendir(const char *name); //成功返回处理的指针, 错误返回NULL
struct dirent *readdir(DIR *dirp); //读取目录下的所有文件.
int closedir(DIR *dirp);//成功为0, 错误-1.
共享文件
- 描述符表. 每个进程独享一个描述符表, 每一个Item指向file table的一个item.
- File Table. 打开文件的集合由一个File Table表示, 所有进程共享一个表, 每个Item由当前的文件位置, 引用计数, 以及一个指向v-node表item的指针. 关闭一个描述符会减少相应File Table的item的引用计数, 直到引用计数为0, 系统才会删除这个File table item.
- V-node表. 所有进程共享. 每个item包含文件的stat信息.
I/O重定向
#include <unistd.h>
int dup2(int oldfd, int newfd); //成功返回非负描述符, 错误返回-1.
标准I/O
C语言定义的高级函数库, 提供了
- 打开关闭函数fopen 和 fclose
- 读写字节的函数fread 和 fwrite
- 读写字符串的函数fgets 和 fputs
- 格式化函数 scanf 和 printf
总结
- 尽可能使用标准I/O, 除stat外, 标准I/O没有对应的函数
- 不要使用scanf或rio_readlineb来读二进制文件, 而是用来读文本文件
- 对网络套接字使用RIO
原文地址:https://www.cnblogs.com/winwink/p/CSAPP_Note_Chapter10_SystemIO.html
- jQuery插件 -- Form表单插件jquery.form.js
- PHP验证手机号码和归属地 PHP函数代码
- 浅谈PHP 5中垃圾回收算法的演化
- POJ 2484 A Funny Game(智商博弈)
- php pathinfo()的用法
- BZOJ 1874: [BeiJing2009 WinterCamp]取石子游戏(SG函数)
- 微信公众平台开发
- BZOJ 1115: [POI2009]石子游戏Kam (阶梯nim)
- php性能监测模块XHProf
- BZOJ 1022: [SHOI2008]小约翰的游戏John (Anti-nim)
- 洛谷P2252 取石子游戏(威佐夫博弈)
- HDU 3032 Nim or not Nim?(Multi-Nim)
- POJ 2311 Cutting Game(二维SG+Multi-Nim)
- js去掉html标签和去掉字符串文本的所有的空格
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 详解PHP多个进程配合redis的有序集合实现大文件去重
- 原生PHP实现导出csv格式Excel文件的方法示例【附源码下载】
- php ajax confirm 删除实例详解
- PHP模糊查询技术实例分析【附源码下载】
- 解决keras,val_categorical_accuracy:,0.0000e+00问题
- 导致python中import错误的原因是什么
- Python RabbitMQ实现简单的进程间通信示例
- PHP删除数组中特定元素的两种方法
- 如何写出让同事无法维护的代码?
- 浅谈php://filter的妙用
- PHP中“=>
- CI(CodeIgniter)框架中URL特殊字符处理与SQL注入隐患分析
- PHP实现获取毫秒时间戳的方法【使用microtime()函数】
- 利用PHP如何统计Nginx日志的User Agent数据
- PHP树形结构tree类用法示例