做网站530元,商城小程序需要什么资质,长沙网站排名优化价格,大型网站化方案本文是基础IO的第一个部分#xff0c;基础IO部分将主要讲解以下内容#xff1a;文件fd 文件系统 软硬链接 操作系统的内存管理 以及 动静态库。本节重点讲解文件fd#xff0c;其余内容将在后面的博客更新。 一、共识 文件 内容 属性 文件分为打开了的文件和没打开的文件。… 本文是基础IO的第一个部分基础IO部分将主要讲解以下内容文件fd 文件系统 软硬链接 操作系统的内存管理 以及 动静态库。本节重点讲解文件fd其余内容将在后面的博客更新。 一、共识 文件 内容 属性 文件分为打开了的文件和没打开的文件。 打开的文件谁打开进程 本质是研究进程和文件的关系 没打开的文件磁盘里很多如何存储------快速增删查改。 本节重点讨论打开的文件 文件被打开必须先加载到内存且是其属性先加载到内存一个进程可以打开多个文件。 操作系统内一定存在着大量被打开的文件要对他们进行管理先描述再组织 此时对文件的管理就转换成对链表的增删查改。 目录
一、共识
二、C文件接口
三、过渡到系统认识文件系统调用
四、访问文件的本质
五、重定向和缓冲区
重定向
缓冲区 二、C文件接口 FILE *fp fopen (log.txt,w); 如果没有指定路径默认在当前路径创建当前路径指进程的当前路径即cwd如果更改了cwd就把文件创建到新的路径了。 child/home/JY//更改当前进程的工作路径。 size_t fwrite ( const void *ptr,size_t size,size_t nmemb,FILE * stream ); size:一个基本单位的大小 nmemb几个基本单位 const char *message hello Linux;
fwrite(message,strlen(message),1,fp);w 写入前会先对文件进程清空。 echo hello Linux log.txt 输出重定向本质打开log.txt 文件清空再写入。 a 追加往文件结尾处写。 三、过渡到系统认识文件系统调用 文件在磁盘上访问文件就是访问硬件。用户不能直接访问硬件必须通过系统调用接口。 打开文件的系统调用接口 int open ( const char *pathname,int flags,mode_t mode) pathname文件路径 mode文件权限如果没传文件的权限可能为乱码手动传了之后注意还有umask更改当前进程的umaskumask0 flags打开文件的方式比特位级别的传参方式 可传O_RDONLY只读 O_WRONLY只写 O_RDWR读写 O_CREAT创建 O_APPEND追加O_TRUNC (清空等等。 头文件sys/types.h sys/stat.h fcntl.h 补充比特位级别的传参 C语言里的fopen函数就是对open系统调用接口的封装 如FILE *fp fopenlog.txt,w; 其内部一定封装了int fd open(log.txt,O_WRONLY|O_CREAT|O_TRUNC,0666); 以“w”方式打开如果文件不存在会自动创建一个所以要带O_CREAT;打开文件后会先清空文件内容所以要带O_TRUNC。 ssize_t write ( int fd,const void * buf,size_t count ); ssize_read ( int fd,void * buf,size_t count ); 四、访问文件的本质 open的返回值fd本质就是array数组的下标FILE是C库自己定义的struct其中必定也封装了fd。 printf(stdin-fd:%d\n,stdin-fileno); 补充系统默认打开3个文件键盘文件、显示器文件、显示器文件 在C语言里就是stdinstdoutstderr 关闭文件struct file里有一个引用计数count在调用close1 会将1号文件的count--判断count是否为0在将struct file* 置空为0就回收该struct file。 五、重定向和缓冲区 文件描述符的分配规则是什么 从0小标开始寻找最小的没有使用的数组位置它的下标就是新文件的文件描述符。 重定向 close1之后1号位置指向空open log.txt时从小下标开始找找到1就让1指向log.txt所以后面在向1号文件write时就是往log.txt里写入了。这就是重定向的原理。 其实不用先关闭再打开只需要有一个系统接口能将3号指针拷贝给1号指针就能完成重定向。 对应的系统调用接口 追加重定向把选项O_TRUNC改为O_APPEND 缓冲区 C缓冲区刷新 a、无缓冲直接刷新 b、行缓冲 c、全缓冲文件 先看一个现象下面程序运行时为什么没有结果输出到显示器 每个打开的文件都有一个语言级别的缓冲区C语言里的printf/fprintf/fwrite等会先将数据写到C语言提供的缓冲区里区别于内核级缓冲区它会在某些时机刷新到内核级的缓冲区。在本例中fwrite写到了C语言级的缓冲区然后就将1号显示器文件关闭了并没有写入内核级的缓冲区因此没有成功将数据写入1号显示器文件。 现象二上面的代码是能成功打印hello Linux的。 write是系统接口会直接将数据写入内核级缓冲区所以即使没有‘\n’也会显示结果。 现象三 由显示器重定向到文件时刷新方案由行缓冲变成了全缓冲write是直接写到系统缓冲区的而printf等C接口本来是行缓冲但变为了全缓冲就先不刷新了fork创建子进程后发生写时拷贝因此数据多了一份进程结束后就刷新了缓冲区。 用户刷新的本质将数据通过write写到内核中平时用的flush一定封装了write。 进程退出时也会刷新缓冲区那为什么还需要语言级的缓冲区呢 1、解决效率问题 2、配合格式化