注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Mihooke's blog

IT之恋

 
 
 

日志

 
 

《深入理解计算机系统》笔记(六)  

2014-09-27 09:29:26|  分类: 学习录 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |


十、系统级I/O

1、I/O设备将所有的输入和输出都映射为文件的方式,而UNIX内核引出一个简单低级的应用接口,叫做UNIX I/O

2、文件描述符:应用程序通过内核打开文件,内核返回一个小的非负整数,叫描述符。UNIX外壳创建的每个进程开始时都有三个打开的文件:标准输入(0)、标准输出(1)、标准错误(2) ,括号内是描述符。

3、打开文件函数openint open(char *filename, int flags , mode_t mode);

open函数filename转换为一个文件描述符,返回的描述符总是在进程中当前没有打开的最小描述符。

flags参数是如何访问这个文件:O_RDONLY  ;  O_WRONLY  ;  O_RDWR 

flags参数还可以是一个或多个掩码的或:O_CREAT  ;  O_TRUNC(文件存在就截断它)  ;O_APPEND(每次写操作前,设置文件位置到文件结尾处),如:

fd = open (foo.txt,O_WRONLY|O_APPEND,0);

mode参数指定了新文件的权限位。每个进程都有一个umask值,它是当前文件系统中创建文件或目录的默认权限值,其中文件值是777,目录值是666,可以用umask函数设置。给定modeumask的默认值:

#define DEF_MODE S_IRUSR|S_IWUSR|S_IRGRP|S_IEGRP|S_IROTH|S_IWOTH(三组分别是当前用户、用户所在组、其他用户)

#define DEF_UMASK  S_IWGRP|S_IWOTH

例子:创建一个新文件,要求文件的拥有者有读写权限,所有其他用户只有读的权限。

umask(DEF_UMASK);对应的umask值就是022啦。

fd = open(foo.txt,O_CREAT|O_TRUNC|O_WRONLY,DEF_MODE);

其实,与其通过open函数设置权限,不如在新建文件之后用chmod来修改权限方便。

4、文件读写函数read()write()

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

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

size_t 被定义为unsigned int ,ssize_t被定义为int

read函数从描述符为fd的当前文件位置拷贝最多n个字节到存储器位置buf,成功则返回读的字节数,返回0表示EOF,返回-1表示失败。

5、RIO

readwrite函数在某些情况下传送的字节比应用程序要求的要少,这些不足值可以用RIO包来处理。RIO包主要提供两类函数:无缓冲的输入输出函数、带缓冲的输入函数

无缓冲的输入输出函数:对二进制数据写到网络和从网络读写二进制数据尤其有用。调用函数rio_readnrio_writen函数,用法和read/write函数一样。

带缓冲的输入函数:要读取的内容缓存在应用及缓冲区,可以高效地读取。带缓冲的RIO函数是线程安全的,在同一个描述符上可以被交错地调用。包装函数rio_readlineb从一个内部读缓冲区拷贝一个文本行,当缓冲区变空时,会自动调用read重新填满缓冲区。每打开一个描述符都会调用rio_readinitb函数,将描述符fd和地址rp处的一个类型为rio_t的读缓冲区联系起来。

6、文件元数据读取函数stat()fstat()

元数据就是文件的信息。

int stat(const char *filename , struct stat *buf);

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

在结构体中会用到st_modest_size两个成员,st_mode编码了文件的许可位和文件类型;st_size包含了文件的字节数大小。

7共享文件

内核用三个数据结构表示打开的文件:描述符表、文件表和v-node表。

文件表:打开的文件的集合由一张文件表来表示的,所有的进程共享这张表,其中包括一个指向v-node的指针。

v-node也是由所有进程共享的,包含stat结构中大多数信息。

每个描述符都有自己的文件位置,不同的描述符读操作可以从文件的不同位置获取数据;多个描述符也可以通过不同的文件表表项来引用同一个文件。我们知道,父子进程是共享文件的,这样就能理解了父子进程是如何共享进程的,父子进程是共享相同的文件表集合,共享相同的文件位置来实现资源共享的。在内核删除相应的文件表表项之前,父子进程必须都关闭了它们的描述符。

8、I/O重定向函数dup2(int oldfd,int newfd),拷贝oldfdnewfd,并覆盖newfd以前的内容 。
  评论这张
 
阅读(40)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017