标签:
【学习时间:4小时】
【学习内容:第十章——系统级I/O】
代码:
int open(char *filename,int flags,mode_t mode);
作用:将filename转换为一个文件描述符,并且返回描述符数字(当前进程没有打开的最小描述符数字)。
ssize_t rio_writen(int fd,const void *usrbuf,size_t n);
ssize_t rio_writen(int fd,const void *usrbuf,size_t n);
rio__writen函数遇到EOF的时候返回0;
rio__readn遇到EOF的时候返回不足值(即 不足n的那个部分的字节数)。
对同一个描述符,可以任意交错地调用rioreadn和riowriten函数。
主要的函数:
ssizet rioreadlineb(rio_t *rp,void *usrbuf,size_t maxlen);
rioreadnb(riot *rp,void *usrbuf,size_t n) ;
rioreadinitb(riot *rp,int fd);
源代码如下:
static ssize_t rio_read(rio_t *rp,char *usrbuf,size_t n)
{
int cnt;
while(rp->rio_cnt<=0)
{
rp->rio_cnt=read(rp->rio_fd,rp->rio_buf,sizeof(rp->rio_buf));
if(rp->rio_cnt<0)//排除文件读不出数据的情况
{
if(error != EINTR)
{
return -1;
}
}
else if(rp->rio_cnt=0)
return 0;
else
rp->rio_bufptr = rp->rio_buf;
}
cnt=n;
if(rp->rio_cnt<n)
cnt=rp->rio_cnt;//以上三步,将n与rp->rio_cnt中较小的值赋给cnt
memcpy(usrbuf,rp->rio_bufptr,cnt);
rp->rio_bufptr+=cnt;
rp->rio_cnt-=cnt;
return cnt;
}
函数:
#include <unistd.h>
#include <sys/stat.h>
int stat(cost char *filename,struc sta *buf);
int fstat(int fd,struct stat *buf);
文件共享方式
假设磁盘文件foobar.txt由6个ASCII码字符“foobar”组成。那么,下列程序的输出是什么?
#include "csapp.h"
int main()
{
int fd1,fd2;
char c;
fd1=Open("foobar.txt",O_RDONLY,0);
fd2=Open("foobar.txt",O_RDONLY,0);
Read(fd1,&c,1);
Read(fd2,&c,1);
printf("c=%c\n",c);
exit(0);
}
【描述符fd1和fd2都有各自的打开文件表表项,所以有它们各自的文件位置。则fd2打开文件读出的第一个字母还是f。】
就像前面那样,磁盘文件foobar.txt由6个ASCII码字符“foobar”组成。那么,下列程序的输出是什么?
int main() { int fd; char c; fd=Open("foobar.txt",O_RDONLY,0); if(Fork()==0) { Read(fd,&c,1); exit(0); } Wait(NULL); Read(fd,&c,1); printf("c=%c\n",c); exit(0); } 【父子进程共享相同的文件表表项,因此依次读取的是“f”和“o”。输出为o。】
本章有很多代码需要理解(因为主要内容都是代码驱动的,只有读懂了代码才可以理解;比如:只有知道了rio_read的含义,才理解为什么RIO包更优秀),所以,虽然内容少,但是还是不能掉以轻心;通过注释和请教同学,对理解也有所推动。
标签:
原文地址:http://www.cnblogs.com/shadow135211/p/4947912.html