linux驱动大小,为什么在Linux字符驱动程序读取调用中大小总是= 4096?
尝试
read(2)(在unistd.h中),它应该输出5个字符.当使用libc(
fread(3),fwrite(3)等)时,你正在使用内部libc缓冲区,它通常是一个页面的大小(几乎总是4 kiB).
我相信第一次调用fread()5个字节时,libc会执行4096字节的内部read(),而后面的fread()将只返回与您使用的FILE结构相关联的缓冲区中已有的libc字节.直到达到4096.第4097个字节将发出另一个4096字节的读取,依此类推.
当你编写时也会发生这种情况,例如当使用printf()时,它只是带有stdout()的fprintf()作为它的第一个参数. libc不会直接调用write(2),而是将你的东西放入其内部缓冲区(也是4096字节).如果你打电话,它会冲洗
fflush(stdout);
你自己,或者在发送的字节中找到字节0x0a(ASCII中的换行符)的任何时候.
尝试一下,你会看到:
#include /* for printf() */
#include /* for sleep() */
int main(void) {
printf("the following message won't show up\n");
printf("hello,world!");
sleep(3);
printf("\nuntil now...\n");
return 0;
}
然而,这将工作(不使用libc的缓冲):
#include /* for printf() */
#include /* for sleep(),write(),and STDOUT_FILENO */
int main(void) {
printf("the following message WILL show up\n");
write(STDOUT_FILENO,"hello!",6);
sleep(3);
printf("see?\n");
return 0;
}
STDOUT_FILENO是标准输出(1)的默认文件描述符.
每次有新行时刷新对于终端用户立即查看消息至关重要,并且对于每行处理也很有帮助,这在Unix环境中已经完成了很多工作.
因此,即使libc直接使用read()和write()系统调用来填充和刷新其缓冲区(并且通过C标准库的Microsoft实现必须使用Windows的东西,可能是ReadFile和WriteFile),那些系统调用绝对可以不知道libc.当使用两者时,这会导致有趣的行为:
#include /* for printf() */
#include /* for write() and STDOUT_FILENO */
int main(void) {
printf("1. first message (flushed now)\n");
printf("2. second message (without flushing)");
write(STDOUT_FILENO,"3. third message (flushed now)",30);
printf("\n");
return 0;
}
哪个输出:
1. first message (flushed now)
3. third message (flushed now)2. second message (without flushing)
(第二个之前的第三个!).
另请注意,您可以使用setvbuf(3)关闭libc的缓冲.示例:
#include /* for setvbuf() and printf() */
#include /* for sleep() */
int main(void) {
setvbuf(stdout,NULL,_IONBF,0);
printf("the following message WILL show up\n");
printf("hello!");
sleep(3);
printf("see?\n");
return 0;
}
我从来没有尝试过,但我猜你可以用FILE *来做同样的事情,当fopen()你的角色设备并禁用I / O缓冲时:
FILE* fh = fopen("/dev/my-char-device","rb");
setvbuf(fh,0);
linux驱动大小,为什么在Linux字符驱动程序读取调用中大小总是= 4096?相关推荐
- 水星usb无线网卡linux驱动,水星MW150US安装Linux驱动
水星MW150US安装Linux驱动 2013-4-29 王健宇 Linux 假期前一天,和同事同买的无线网卡到货了,查了一下没有linux驱动,直接崩溃掉:当天晚上查到了这款无线网卡芯片是realt ...
- 显卡linux驱动安装教程,在Linux下安装显卡驱动程序
相信大多数人在安装Linux时遇到的第一个难题,就是Linux不认你的显卡.而显卡安装不正确或胡乱选一个驱动程序安上则难以进入X Window.即使勉强进去了,因为分辨率太低,桌面上的文字和图片都放大 ...
- Linux驱动编程 step-by-step (一)驱动程序的作用
驱动程序的作用: 简单来说 驱动程序就是使计算机与设备通信的特殊的代码,在作单片机时候(无OS)我们自己定义接口及自定义的结构来操作相关硬件,而在有OS的模式下我们操作的硬件是去实现对应的接口(这些接 ...
- linux 串口驱动 4412,⑮tiny4412 Linux驱动开发之tty子系统(UART)驱动程序
本次说一下tty子系统的驱动编程,因为UART相关的寄存器比较多,同时,应用比较广泛,所以本次的驱动程序量也不少,而且只是完成和特定CPU相关的一部分,通用的部分本次都没有涉及到.在写驱动之前,我们先 ...
- Linux驱动开发(从零开始编写一个驱动程序)
1.系统整体工作原理 (1)应用层->API->设备驱动->硬件 (2)API:open.read.write.close等 (3)驱动源码中提供真正的open.read.write ...
- ⑨tiny4412 Linux驱动开发之1-wire子系统(DS18B20)驱动程序
本来这次想做LCD背光灯的调节的,但是没有调通,时间很紧迫,就转向了其它东西,昨天调了一下DHT11,今天又调了一下DS18B20,还算有个安慰,本来是想用1-wire子系统做的,但是时间上有点紧,要 ...
- ㉓AW-H3 Linux驱动开发之mipi camera(CSI)驱动程序
本次说一下mipi camera的驱动开发,平台用的是全志的H3芯片,项目代号:sun8iw7p1,这次使用运行在H3上面的Ubuntu进行验证的. Linux代码:https://github.co ...
- linux驱动基础开发1——linux 设备驱动基本概念-转
学习linux设备驱动首先我们必须明确以下几个概念,为我们接下来学习linux驱动打下坚实的基础: 应用程序.库.内核.驱动程序的关系 设备类型 设备文件.主设备号与从设备号 驱动程序与应用程序的区别 ...
- linux驱动是什么文件,Linux设备驱动 之一切皆是文件思想
不错,今天walfred将在快速上手linux设备驱动这一块,谈谈linux的设备也符合"一切皆是文件"的思想在linux设备驱动模型应用.如果你不理解Linux设备模型,请看下面 ...
最新文章
- 【Ubuntu】ubuntu设置GUI程序自启动
- Visual Studio警告IDE0006的解决办法
- 鸿蒙系统哪里的,华为“鸿蒙系统”IPFS/FIL:区块链的“鸿蒙系统”?
- 通过工具SecureCRTPortable将项目部署到服务器上
- 使用VMware VSphere WebService SDK进行开发 (三)——获取主机(HostSystem)的基本信息
- 容器编排技术 -- Kubernetes 声明网络策略
- .NET自动服务程序—C#
- python中sys用法_Python中sys模块功能与用法实例详解
- luogu P1216 [IOI1994][USACO1.5]数字三角形 Number Triangles (递推)
- 【VC++类型转换】string转换为CString
- 西农JAVA作业提交系统_Java程序员需要知道的操作系统知识汇总(持续更新)
- Axure RP 9 安装、汉化
- elsevier模板通讯作者添加脚注的方法[已解决]
- c语言return后面有没有分号,为什么末尾加return 0;}反而不能通过?(符号英文半角,分号没漏)...
- 重新制定了目标 这样才知道为啥活着 重新起航 星辰大海
- Python最简单的图片爬虫,只用20行代码爬遍全网
- 采药(洛谷-P1048)
- 注册测绘师资格拟认定人员公示名单
- android 开源 高斯模糊_Android高斯模糊你所不知道的坑
- eclipse启动慢?试试如下操作