模拟文件打开写入关闭的过程
my_stdio.h#pragma once #define SIZE 1024 #define FLUSH_NONE 0 #define FLUSH_LINE 1 #define FLUSH_FULL 2 struct IO_FILE { int flag; // 刷新方式 int fileno; // 文件描述符 char outbuffer[SIZE]; int cap; int size; // TODO }; typedef struct IO_FILE mFILE; mFILE *mfopen(const char *filename, const char *mode); int mfwrite(const void *ptr, int num, mFILE *stream); void mfflush(mFILE *stream); void mfclose(mFILE *stream);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(const char *filename, const char *mode) { int fd -1; if(strcmp(mode, r) 0) { fd open(filename, O_RDONLY); } else if(strcmp(mode, w) 0) { fd open(filename, O_CREAT|O_WRONLY|O_TRUNC, 0666); } else if(strcmp(mode, a) 0) { fd open(filename, O_CREAT|O_WRONLY|O_APPEND, 0666); } if(fd 0) return NULL; mFILE *mf (mFILE*)malloc(sizeof(mFILE)); if(!mf) { close(fd); return NULL; } mf-fileno fd; mf-flag FLUSH_LINE; mf-size 0; mf-cap SIZE; return mf; } void mfflush(mFILE *stream) { if(stream-size 0) { // 写到内核文件的文件缓冲区中! write(stream-fileno, stream-outbuffer, stream-size); // 刷新到外设 fsync(stream-fileno); stream-size 0; } } int mfwrite(const void *ptr, int num, mFILE *stream) { // 1. 拷贝 memcpy(stream-outbufferstream-size, ptr, num); stream-size num; // 2. 检测是否要刷新 if(stream-flag FLUSH_LINE stream-size 0 stream-outbuffer[stream-size-1] \n) { mfflush(stream); } return num; } void mfclose(mFILE *stream) { if(stream-size 0) { mfflush(stream); } close(stream-fileno); }我们用文字来描述一下过程我们C语言在写文件的时候是写到对应文件的缓冲区里面的在关闭文件的时候会将文件缓冲区里面的内容刷新到操作系统缓冲区里面进而写到外设上去