52、【OS】【Nuttx】【OSTest】setvbuf 测试
背景
接上篇 blog
51、【OS】【Nuttx】【OSTest】参数解析:参数处理过程
已经分析完参数解析功能,下面来看下一个测试项
CONFIG_STDIO_DISABLE_BUFFERING
CONFIG_STDIO_DISABLE_BUFFERING 用于控制标准输入输出(stdio)的缓冲行为
当该配置项被启用时,所有的 IO 操作会直接作用于底层设备,而不会通过缓冲区延迟处理,通常用于实时性高或低延迟的场景,比如实时数据采集,交互式程序输出同步等
当没有定义该配置项时,将执行 setvbuf 测试
setvbuf
setvbuf 是 C 标准库中的一个函数,用于控制文件流的缓冲方式, 以允许程序在打开文件流后设置或更改流的缓冲模式和缓冲区,对需要精确控制输入输出行为的程序来说很有用,比如当需要确保数据尽快写入文件或者当需要优化读取性能时。
函数定义如下
下面逐段来看 setvbuf 的描述
- setvbuf 必须在文件流(stream)与某个打开的文件关联,并且在对该流执行其他操作之前调用
- 如果已经对流进行了其他操作(比如读写),再调用 setvbuf() 会失败
- _IOFBF:全缓冲,数据在缓冲区满时写入设备,或显式调用 fflush 函数,或关闭文件时写入,
适用于文件操作 - _IOLBF:行缓冲,数据在遇到换行符(\n)时写入设备,通常用于交互式终端(如标准输入输出流)
- _IONBF:无缓冲,所有操作立即生效,不经过缓冲区,适用于需要实时输出的场景
- 如果 buffer 非空,则使用用户提供的缓冲区,size 参数指定该缓冲区的大小
- 如果 buffer 为空,则 setvbuf() 会自动分配一个缓冲区,大小由 size 参数决定
- 缓冲区内容在任何时候都是未定义的(用户不应该依赖缓冲区的数据)
setvbuf_test
下面来看 setvbuf 的测试项
Test NO buffering
第一个测试项,测试 _IONBF,首先打开文件流 stream,设置 _IONBF 后,此时 fprintf 数据到 stream,/dev/console 将立即显示出来
Test FULL buffering
测试 _IOFBF,此时没有传入缓冲区指针,系统默认分配出 64 字节的缓冲区,此时 fprintf 将数据 “setvbuf_test: Using default FULL buffering\r\n” 输入到缓冲区,由于此时内容还没到 64 字节,此时终端并不会输出内容,只有当调用 fclose 时,终端才有内容输出
Test FULL buffering, pre-allocated buffer
同样是测试 _IOFBF,不过此时是通过用户传入了自定义的 buffer 缓冲区,效果和上面用系统默认的一样,关闭文件才能显示
Using LINE buffering
测试 _IOLBF,由于这里打开的是 /dev/console,终端控制台,所以效果和 _IOFBF 是一样的,需关闭文件才能显示
Test LINE buffering, pre-allocated buffer
测试 _IOLBF,传入用户定义的 buffer 指针,效果和上面一样,关闭文件才能显示