【七】基础IO实践--简单设计实现libc库

发布时间:2026/11/5 3:55:08
【七】基础IO实践--简单设计实现libc库

my_stdio.h

$ cat my_stdio.h#pragmaonce#defineSIZE1024//缓冲区大小#defineFLUSH_NONE1//无缓冲#defineFLUSH_LINE2//行缓冲#defineFLUSH_FULL4//位图控制传参控制刷新模式structIO_FILE{intflag;// 刷新⽅式intfileno;// ⽂件描述符charoutbuffer[SIZE];intcap;intsize;// TODO};typedefstructIO_FILEmFILE;mFILE*mfopen(constchar*filename,constchar*mode);intmfwrite(constvoid*ptr,intnum,mFILE*stream);voidmfflush(mFILE*stream);voidmfclose(mFILE*stream);

my_stdio.c

$ cat my_stdio.c#include"my_stdio.h"#include<string.h>#include<stdlib.h>#include<sys/stat.h>#include<sys/types.h>#include<fcntl.h>#include<unistd.h>mFILE*mfopen(constchar*filename,constchar*mode){intfd=-1;if(strcmp(mode,"r")==0){fd=open(filename,O_RDONLY);}elseif(strcmp(mode,"w")==0){fd=open(filename,O_CREAT|O_WRONLY|O_TRUNC,0666);}elseif(strcmp(mode,"a")==0){fd=open(filename,O_CREAT|O_WRONLY|O_APPEND,0666);}if(fd<0)returnNULL;mFILE*mf=(mFILE*)malloc(sizeof(mFILE));if(!mf){close(fd);returnNULL;}mf->fileno=fd;mf->flag=FLUSH_LINE;mf->size=0;mf->cap=SIZE;returnmf;}voidmfflush(mFILE*stream){if(stream->size>0){// 写到内核⽂件的⽂件缓冲区中!write(stream->fileno,stream->outbuffer,stream->size);// 刷新到外设fsync(stream->fileno);stream->size=0;}}intmfwrite(constvoid*ptr,intnum,mFILE*stream){// 1. 拷⻉memcpy(stream->outbuffer+stream->size,ptr,num);//更新stream->size+=num;// 2. 检测是否要刷新if(stream->flag==FLUSH_LINE&&stream->size>0&&stream->outbuffer[stream->size-1]=='\n'){mfflush(stream);}returnnum;}//关闭之前强制刷新voidmfclose(mFILE*stream){//强制刷新if(stream->size>0){mfflush(stream);}//关闭文件close(stream->fileno);//释放free(stream);}

main.c

$ cat main.c#include"my_stdio.h"#include<stdio.h>#include<string.h>#include<unistd.h>intmain(){mFILE*fp=mfopen("./log.txt","a");if(fp==NULL){return1;}intcnt=10;while(cnt){printf("write %d\n",cnt);charbuffer[64];snprintf(buffer,sizeof(buffer),"hello message, number is : %d",cnt);cnt--;mfwrite(buffer,strlen(buffer),fp);mfflush(fp);sleep(1);}mfclose(fp);}