首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Linux内核编程--文件流与缓冲区

Linux系统下,通过编程对文件进行操作的方式有两种机制:文件描述符和文件流 1.文件描述符和文件流的区别: 文件描述符的类型为int,文件流的类型为FILE*(文件指针)。...Linux内核操作文件会使用高速缓冲区。...比如write操作, 进程把数据写到缓冲区, 然后内核把数据从缓冲区写到磁盘文件。 当进程不断写入数据时,内核可以等缓冲区满了再一次性往磁盘写入,这样可以提高性能。...流程图如下: 缓冲分三种模式: (1)全缓冲,写满标准I/O缓冲区后才进行I/O操作, 例如磁盘文件(非交互式设备)的I/O操作 (2)行缓冲,在输入/输出中遇到换行符时才进行I/O操作,例如在终端进行...,buf为缓冲区首地址,mode为缓冲区类型,size为缓冲区内字节的数量 --mode参数如下: _IOFBF:全缓冲模式 _IOLBF:行缓冲模式 _IONBF:无缓冲模式 若成功则返回0,若出错则为非

2.8K10
您找到你想要的搜索结果了吗?
是的
没有找到

Linux文件操作文件描述符重定向缓冲区

文件操作接口的使用 三、文件描述符 1、什么是文件描述符 2、文件描述符的分配规则 四、重定向 1、什么是重定向 2、dup2 系统调用 3、三种重定向的实现 五、Linux 下一切皆文件 六、缓冲区...)写入到stdout中 } close(fd); return 0; } ---- 五、Linux 下一切皆文件 在刚开始学习 Linux 的时候,我们就说 Linux 下一切皆文件...,即 Linux 下一切皆文件。...(比如缓冲区写入一次数据一共要花费 1s,那么可能其中 990ms 都在等待外设就绪,只有 10ms 左右的时间在进行数据写入) 所以,为了提高效率,缓冲区一定会结合具体的设备定制自己的刷新策略,Linux...3、缓冲区的位置 在之前的 进度条代码 中我们知道,我们谈论的所有缓冲区都不在操作系统内核中,而是位于用户级语言层面;实际上,对于C语言来说,缓冲区位于 FILE 结构体中,Linux 下,我们可以在

3.9K00

Linux】理解缓冲区

进程需要把数据拷贝到缓冲区里:我们并不需要拷贝,而是调用fwrite,与其理解fwrite是写入到文件的函数,倒不如理解fwrite是拷贝函数,将数据从进程拷贝到缓冲区或者外设当中。...——全缓冲——磁盘文件,效率最高,只需要一次IO,比如文件读写的时候,直接写到磁盘文件 但是存在特殊情况:a.用户强制刷新 b,进程退出——一般到要进行缓冲区刷新 所以对于全缓冲,缓冲区满了采取刷新,减少...3.在哪里 缓冲区的位置究竟在哪里:从上面的例子我们直接往显示器上打印结果为4条,往文件打印为7条,这跟缓冲区有关,同时这也说明了缓冲区一定不在内核中,为什么?...FILE结构体缓冲区,所以我们直接要强制刷新的时候fflush(文件指针),关闭文件fclose(文件指针),这是因为传进去的文件指针对应的缓冲区 从源码出发,我们可以来看一看FILE结构体: 所以我们一般所说的缓冲区是语言级别的缓冲区...2.如果我们进行了重定向>,写入文件不在是显示器,而是普通文件,采用的刷新策略是全缓冲,之前的3条C函数虽然带了\n,但是不足以将stdout缓冲区写满,所以数据并没有刷新!

20840

Linux:基础IO(二.缓冲区、模拟一下缓冲区、详细讲解文件系统)

我们先来看看Linux下的文件特性 文件=内容+属性 内容的大小不确定,可能很大,可能很小 属性的大小是固定的:属性的类别是一样的,但是每个类别里的内容不一样。...是一系列的 Linux 文件系统,最常见的是 Ext2、Ext3 和 Ext4 每一个分区有自己的文件系统。...优点: Ext2 文件系统简单、可靠,并且在 Linux 社区得到了广泛的支持和应用。它的设计目标是提供一个高性能的文件系统,同时保持数据的稳定性和一致性。...inode编号只在一个分区里是唯一的,那我们怎么知道是在哪个分区 在Linux系统中,被写入文件系统的分区在被使用之前需要进行“挂载”操作。...这是因为在Linux系统中,有一个环境变量叫做PATH,它包含了一系列目录路径,系统会根据这些路径来搜索可执行文件

15510

Linux修炼】13.缓冲区

(磁盘文件) 当然还有两种特殊情况 用户强制刷新:fflush 进程退出 ——>进程退出都要进行缓冲区刷新 所说的缓冲区在哪里?...所以我们自己要强制刷新的时候,fflush传入的一定是文件指针,fclose也是如此,即:fflush(文件指针),fclose(文件指针) 通过查看:vim /usr/include/libio.h...因此我们所调用的fscanf,fprintf,fclose等C语言的文件函数,传入文件指针时,都会把相应的数据拷贝到文件指针指向的文件结构体中的缓冲区中。...如果进行了重定向>,写入的就不是显示器而是普通文件,采用的刷新策略是全缓冲,之前的三条C显示函数,虽然带了\n,但是不足以将stdout缓冲区写满!...缓冲区与OS的关系 我们所写入到磁盘的数据hello bit是按照行刷新进行写入的,但并不是直接写入到磁盘中,而是先写到操作系统内的文件所对应的缓冲区里,对于操作系统中的file结构体,除了一些接口之外还有一段内核缓冲区

1.8K00

文件底层的理解之缓冲区

上面这张图我们在之前的博客中也有所提及,我们可以看到,语言层面的缓冲区其实封装在struct file结构体内部的,也就是说,一个文件一个缓冲区。...二、向文件中写数据的具体过程 以C语言来举例,用户在调用fwrite、fputs这些函数的时候,并不是直接将数据写入到了操作系统内部(因为系统调用时有成本的),而是先将数据写入到了语言层面的缓冲区中,...这就是向文件中写数据的具体过程。在用户层面,在调用fwrite、fputs这些函数的时候你只需要将数据写入缓冲区里就可以直接返回了,这大大提高了这些C语言函数的使用效率。...三、缓冲区刷新的时机 如果用户强制刷新,缓冲区的内容就会直接写入操作系统; 进程退出的时候,缓冲区也会刷新; 如果是按行刷新,遇到‘\n’缓冲区就会刷新(显示器文件); 缓冲区写满时就会自动刷新...(普通文件)。

9010

Linux重定向及缓冲区理解

运行结果: 因为之前没关1文件,所以它被分配的文件描述符是3,但我们用dup2改变了文件描述符下标为1的内容,将它的内容改为和下标为3的内容一样,做到了重定向; 缓冲区:         在上一篇文件系统中我讲到...,linux每个文件都有自己的文件内核级缓冲区,也就是一段内存空间,但它究竟有什么用?...其实在语言层面,对每个文件也有个语言级缓冲区,也称用户级缓冲区。它的主要作用就是,解耦和提高效率。  ...,根据刷新策略来决定什么时候调用系统调用来刷新到内核级缓冲区,再由内核级缓冲区刷新到文件中。...满了才刷新,普通文件  还有特殊情况,当进程退出或者使用fflush接口也可以立刻刷新缓冲区

7410

【C 语言】文件操作 ( C 语言中的文件操作函数 | 磁盘与内存缓冲区 | 缓冲区工作机制 )

文章目录 一、C 语言中的文件操作函数 二、磁盘与内存缓冲区 三、缓冲区工作机制 一、C 语言中的文件操作函数 ---- 读取 文本文件 可以使用 getc , fgets , fscanf 函数 ,...向 文本文件 写出数据可以使用 putc , fputs , fprintf 函数 ; 读取 二进制文件 可以使用 fread 函数 , 向 二进制文件 写出数据可以使用 fwrite 函数 ; 二、磁盘与内存缓冲区...---- 上述所有读写文件的函数 , 都是缓冲区函数 , 即 C 语言中的文件操作 , 都是缓冲区函数 ; 磁盘 是由 操作系统 进行读写的 , 用户写的程序 , 不能直接操作磁盘 ; 操作系统 提供...中 , 维护了一个缓冲区 , 这个缓冲区是 内存 中的缓冲区 ; 使用 C 语言文件操作函数 读写的 数据 , 不是直接来自磁盘 , 而是来自 内存中缓冲区 ; 三、缓冲区工作机制 ---- 缓冲区工作机制...: 缓冲区满了 调用 fclose 关闭文件函数

83810

【Netty】NIO 缓冲区 ( Buffer ) ( 缓冲区读写类型 | 只读缓冲区 | 映射字节缓冲区 )

缓冲区 ( Buffer ) 存取类型 II . 只读缓冲区 ( ReadOnlyBuffer ) III . 映射字节缓冲区 ( MappedByteBuffer ) I ....() 方法 , 可以返回一个只读缓冲区 , 该缓冲区 , 只能读取 , 不能写入 ; ② 实际类型 : 只读缓冲区的类型是 HeapByteBufferR ; ③ 只读缓冲区写入数据异常 : 该 只读缓冲区...映射字节缓冲区 ( MappedByteBuffer ) : 在内存中修改文件 , 不需要将文件中的内容拷贝到内存中 , 再修改后 , 写回到文件 , 其性能提高了很多 ; ① 内存说明 : 修改文件的内存并不是堆内存...randomAccessFile.getChannel(); //FileChannel.MapMode.READ_WRITE : 指的是读写模式 //0 : 将文件从...0 位置开始映射到内存中 //10 : 将文件从 0 位置开始映射到内存中的大小 //即 将 file.txt 文件从 0 开始的 10 字节映射到内存中

1.6K10

Linux防止stack缓冲区溢出的有效方法

检测和防治stack缓冲区溢出的方法可谓是汗牛充栋,如果讲起来,那便是一个系列,我也不知道该从何说起。...有没有什么办法,不需要程序做任何改变,就能做到检测stack缓冲区溢出呢? 当然有!在编译过程中添加stub即可!...…[其实fs寄存器还有很多偏移没有用到,为啥非要瞄准0x28,因为我想替掉stack protector] 我无心修改Linux的gcc编译器,我也无力修改,所以我这里只能演示,下面是一个代码: #..."mov %%r11, %%fs:0x28 \n\t" : : :); // 开始正常的函数流程 unsigned long *p; // 以某种方式造成可悲的缓冲区溢出...// 以这种"主动"的方式进行缓冲区溢出,并不意味着它是可用的,这里仅仅是先造成效果 p = (unsigned long *)&p; *(p + 2) = (unsigned long)stub_func

1.6K40

xv6(10) 文件系统:磁盘&缓冲区

文件系统:磁盘&缓冲区 $xv6$ 将文件系统的设计分为 7 层:$磁盘 \rightarrow 缓冲区 \rightarrow 日志 \rightarrow inode \rightarrow 目录...\rightarrow 路径 \rightarrow 文件描述符$ ,本文讲述磁盘和缓冲区两个部分 首先来看磁盘,前面中断部分已经说过一种硬件中断控制器,了解硬件主要就是了解硬件可编程的物理接口寄存器,...它俩其实就是个普通文件,只是交由 $qemu$ 之后,把它俩当作磁盘使用。...除了我们在内存中给磁盘专门留了一块缓存区之外,磁盘自己本身有个缓冲区,一般也是 512 字节。...所以当 CPU 发送读命令给磁盘后,磁盘就马不停蹄的将数据准备到自己的缓冲区,准备好了之后,触发中断通知 CPU 来拿数据。

30410

Linux基础IO【重定向及缓冲区理解】

not on screen" << endl; close(fd); //记得关闭 这其实就是 重定向 的基本操作 1.4、一切皆文件 如何理解 Linux 中一切皆文件这个概念?...,打开文件流后,将 file* 存入 fd_array 中管理即可,因此在 Linux 中,一切皆文件 ---- 2、重定向 在学习重定向前,首先要明白 标准输入、输出、错误 的用途 标准输入(stdin...再从内核级缓冲区中取数据进行运算,然后存入内核级缓冲区中,最后再由内核级缓冲区冲刷给普通缓冲区 出自知乎 《Linux 实现原理 — I/O 处理流程与优化手段》 这里有一段比较有意思的代码:...类型设计还是比较复杂的,需要考虑很多种情况,不过本质上都是在调用系统级接口,我们现在已经可以模拟实现一个简易版 myFILE 结构体了,具体实现步骤将在下文中揭晓 ---- 总结 以上就是本次有关 Linux...基础IO【重定向及缓冲区理解】的全部内容了,在这篇文章中,我们深入理解了文件描述符的概念,学习了重定向的多种方法,最后还学习了缓冲区的相关知识,清楚了普通文件与特殊文件的不同刷新策略。

26830

文件的拷贝、字节流的缓冲区、BufferedInputStream类

前言 本文主要学习文件的拷贝、字节流的缓冲区、BufferedInputStream类。...首先创建一个字节数组来保存一次性读取多个字节的数据,再把字节数组中的数据一次性写入文件。这里的缓冲区相当字节数组! 2.如何使用缓冲区拷贝文件?...最终实现了文件之间的拷贝是通过字节流的缓冲区。...2.BufferedInputStream作用它相对于普通输入流优点是,它有一个缓冲数组,每次去调用read()方法,先从缓冲区读取数据,如果读取数据失败,从文件读取新数据放到缓冲区,再把缓冲区的内容显示出来...,如果读取数据失败,从文件读取新数据放到缓冲区,再把缓冲区的内容显示出来。

1K20

LinuxLinux文件

Linux文件操作 Linux中,一切皆文件(网络设备除外)。 硬件设备也“是”文件,通过文件来使用设备。 目录(文件夹)也是一种文件。...boot:这里存放的是启动Linux时使用的一些核心文件,包括一些连接文件和镜像文件。...deb:deb是Device(设备)的缩写,该目录下存放的是Linux的外部设备,在Linux中访问设备的方式和访问文件的方式是相同的。...tmp:用来存放一些临时文件 media:Linux系统会自动识别一些设备,例如U盘、光驱等,当识别后,Linux会把识别的设备挂载到这个目录下。...mnt:临时挂载其他文件。 proc:包含了进程的相关信息。 ---- Linux文件的操作方式 文件描述符fd fd是一个大于等于0的整数。

39.7K31

NIO之缓冲区【复制缓冲区

复制缓冲区   复制一个缓冲区会创建一个新的 Buffer 对象,但并不复制数据。原始缓冲区和副本都会操作同样的数据元素。...两个缓冲区共享数据元素,拥有同样的容量,但每个缓冲区拥有各自的位置,上界和标记属性。对一个缓冲区内的数据元素所做的改变会反映在另外一个缓冲区上。这一副本缓冲区具有与原始缓冲区同样的数据视图。...如果原始的缓冲区为只读,或者为直接缓冲区,新的缓冲区将继承这些属性。...,但slice()创建一个从原始缓冲区的当前位置开始的新缓冲区,并且其容量是原始缓冲区的剩余元素数量(limit-position)。...这个新缓冲区与原始缓冲区共享一段数据元素子序列。分割出来的缓冲区也会继承只读和直接属性。

1.2K00

系统文件IO文件描述符重定向FILE缓冲区的理解

return 1; } char outbuff[64]; int cnt = 5; while (cnt) { sprintf(outbuff, "%s:%d\n", "hello Linux...当我们将代码修改一下:hello Linux改成aaaa,然后执行程序。...理解Linux下一切皆文件    在冯诺依曼体系中,硬件都属于外设,对于外设的数据处理,都是先把数据读到内存,当处理完后,再将数据刷新到外设中,这就称作IO。...于是,站在struct file上层去看,所有的文件和设备,统一都是struct file,即内核数据结构,这部分也称为虚拟文件(vfs)。 这就是所谓的Linux一切皆文件!...数据从内存拷贝到缓冲区时,通过fwrite函数来进行拷贝,因此我们与其将fwrite函数理解为是写入到文件的函数,倒不如说它是拷贝函数,将数据从进程进行拷贝到缓冲区或外设。

77030
领券