Linux讲解 文件系统 缓冲区

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Hanani_Jia/article/details/82776898

  这次我们对Linux文件系统进行更加深入的介绍。我们先看一个程序。

我们通过三个函数来进行一下输出。我们的printf自然就是直接在屏幕上的输出,fwrite是我们库函数里边的输出,他的参数(获取数据的地址,写入内容的单字节个数,写入单字节数据的个数,文件描述符)这里我们的文件描述符是stdout也就是我们的标准输出,所以他会直接打印到我们的屏幕上边。write有两种用法这里是用的复杂的那一种(文件描述符,写入的内容,写入内容的长度)。这里我们后边写了一个fork函数,先不多介绍,先看运行结果。

能看到我们的每一条语句都输出了。这就是正常的结果,但是如果我们对我们的文件进行一个重定向。

让我们本该输出到屏幕的内容,输出到我们的文件内。这时候去看我们的文件。

这就有一个奇怪的问题,我们明明只有三个输出语句,但是输出了五句,除了我们的write之外另外的两个都输出了两遍。这时候就要提到我们的fork函数了,我们fork是创建子进程。

这里我们的printf和fwrite都是我们的库函数,而我们的write是我们的系统函数,这里我们还要提到两个名词就是全缓冲和行缓冲,我们的系统都是有缓冲区的,这大家都是知道了,缓冲区自然就是为了提高我们的效率,因为我们一个字符都进行读写操作的话是一个很浪费时间的事情,所以缓冲区就是让我们的数据在缓冲区积累到一定程度之后,一起写入到我们的文件中。但是即使这样也分了几种情况,全缓冲的意思就是说填满标准I/O缓存区才进行实际的I/O操作。磁盘上的了件用标准I/O打开,默认都是全缓存的。当缓存区填满或者进行flush操作时候才会进行磁盘操作。而行缓冲的意思就是当输入输出遇到换行符时候就进行读写操作。标准输入和标准输出都是行缓冲。

我们printf和fwrite是我们的库函数,他在封装的时候就有缓冲区,我们最初的时候让语句输出到显示器的时候他是一个行缓冲,这里我们都是一行的语句。但是当我们对程序进行重定向到我们的文件当中的时候,缓冲方式就变成了我们的全缓冲。

  所以我们运行程序的时候,输出语句到文件,这时候文件里是没有东西的,因为我们的fork函数创建了子进程,子进程是对父进程的完全复制。子进程就有了和父进程一样的数据,这样就导致了语句输出两遍,但是我们的write是没有缓冲区的,他执行的时候会立即进行输出。这个缓冲区是由我们的C库给提供的,本质就是为了提高我们的系统性能。

  有兴趣的可以去我们的库函数源文件中去看我们的缓冲区源码这里就不进行过多的介绍了。

我们可以通过ls -l命令来查看文件的一些详细信息,第一个是我们文件的类型和权限,d开头的说明这个文件是文件夹,-代表普通文件,l代表链接文件,这三个是比较常见的还有后边我们会说到的p管道文件其他的就很少见了。后边的数字1,2,代表的是这个文件的硬链接数,之后会详细的讲,接下来是文件的拥有者和所属组,文件的大小,文件的最后修改时间,还有文件名称。

除了这个命令,我们还可以通过stat命令来查看更加详细的文件属性。

这里边其中有几个概念我们是要了解清楚的,就是Block,IO Block,以及Inode。

之后我们会详细的讲解一下inode结点。

猜你喜欢

转载自blog.csdn.net/Hanani_Jia/article/details/82776898
今日推荐