fopen函数
#include <fcntl.h>
#include <unistd>
#define PERMS 0666
FILE *fopen(char *name,char *mode)
{
int fd;
FILE *fp;
if(*mode!='r'&&*mode!='w'&&*mode!='a')
{
return NULL;
}
for(fp=_iob;fp<_iob+OPEN_MAX;fp++)
{
if((fp->flag&(_READ|_WRITE))==0)
{
break;
}
if(fp>=_iob+PEEN_MAX)
{
return NULL;
}
if(*mode=='w')
{
fd=creat(name,PERMS);
}
else if(*mode=='a')
{
if((fd=open(name,O_WRONLY,0))==-1)
{
fd=creat(name,PERMS);
}
Iseek(fd,0L,2);
}
else
{
fd=open(name,O_RDONLY,0)
}
if(fd=-1)
{
return NULL;
}
fp->fd=fd;
fp->cnt=0;
fp->base=NULL:
fp->flag=(*mode=='r')?_READ:_WRITE;
return fp;
}
}
_fillbuf函数
_fillbuf函数
如果文件不是以读方式打开,则立刻返回EOF,否则试图分配一个缓冲区,建立缓冲区后,_fillbuf调用read填充此缓冲区,设置计数值和指针,并返回缓冲区的第一个字符。随后进行的_fillbuf调用会发现缓冲区已经分配。
#include <unistd>
int _fillbuf(FILE *fp)
{
int bufsize;
if((fp->flag(_READ|_EOF|_ERR))!=_READ)
{
return EOF;
}
bufsize=(fp->flag&_UNBUF)?1:BUFSIZ;
if((fp->base==NULL))
{
if((fp->base=(char *)malloc(bufsize))==NULL)
{
return EOF;
}
}
fp->ptr=fp->base;
fp->cnt=read(fp->fd,fp->ptr,bufsize);
if(--fp->cnt<0)
{
if(fp->cnt==-1)
{
fp->flag|=_EOF;
}
else
{
fp->flag|=_ERR;
}
fp->cnt=0;
return EOF;
}
return (unsigned char)*fp->ptr++;
}
初始化数组_iob;
FILE _iob[OPEN_MAX]=
{
0,(char *)0,(char *)0,_READ,0,
0,(char *)0,(char *)0,_WRITE,1,
0,(char *)0,(char *)0,_WRITE|_UNBUF,2
};