尝试

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?相关推荐

  1. 水星usb无线网卡linux驱动,水星MW150US安装Linux驱动

    水星MW150US安装Linux驱动 2013-4-29 王健宇 Linux 假期前一天,和同事同买的无线网卡到货了,查了一下没有linux驱动,直接崩溃掉:当天晚上查到了这款无线网卡芯片是realt ...

  2. 显卡linux驱动安装教程,在Linux下安装显卡驱动程序

    相信大多数人在安装Linux时遇到的第一个难题,就是Linux不认你的显卡.而显卡安装不正确或胡乱选一个驱动程序安上则难以进入X Window.即使勉强进去了,因为分辨率太低,桌面上的文字和图片都放大 ...

  3. Linux驱动编程 step-by-step (一)驱动程序的作用

    驱动程序的作用: 简单来说 驱动程序就是使计算机与设备通信的特殊的代码,在作单片机时候(无OS)我们自己定义接口及自定义的结构来操作相关硬件,而在有OS的模式下我们操作的硬件是去实现对应的接口(这些接 ...

  4. linux 串口驱动 4412,⑮tiny4412 Linux驱动开发之tty子系统(UART)驱动程序

    本次说一下tty子系统的驱动编程,因为UART相关的寄存器比较多,同时,应用比较广泛,所以本次的驱动程序量也不少,而且只是完成和特定CPU相关的一部分,通用的部分本次都没有涉及到.在写驱动之前,我们先 ...

  5. Linux驱动开发(从零开始编写一个驱动程序)

    1.系统整体工作原理 (1)应用层->API->设备驱动->硬件 (2)API:open.read.write.close等 (3)驱动源码中提供真正的open.read.write ...

  6. ⑨tiny4412 Linux驱动开发之1-wire子系统(DS18B20)驱动程序

    本来这次想做LCD背光灯的调节的,但是没有调通,时间很紧迫,就转向了其它东西,昨天调了一下DHT11,今天又调了一下DS18B20,还算有个安慰,本来是想用1-wire子系统做的,但是时间上有点紧,要 ...

  7. ㉓AW-H3 Linux驱动开发之mipi camera(CSI)驱动程序

    本次说一下mipi camera的驱动开发,平台用的是全志的H3芯片,项目代号:sun8iw7p1,这次使用运行在H3上面的Ubuntu进行验证的. Linux代码:https://github.co ...

  8. linux驱动基础开发1——linux 设备驱动基本概念-转

    学习linux设备驱动首先我们必须明确以下几个概念,为我们接下来学习linux驱动打下坚实的基础: 应用程序.库.内核.驱动程序的关系 设备类型 设备文件.主设备号与从设备号 驱动程序与应用程序的区别 ...

  9. linux驱动是什么文件,Linux设备驱动 之一切皆是文件思想

    不错,今天walfred将在快速上手linux设备驱动这一块,谈谈linux的设备也符合"一切皆是文件"的思想在linux设备驱动模型应用.如果你不理解Linux设备模型,请看下面 ...

最新文章

  1. 【Ubuntu】ubuntu设置GUI程序自启动
  2. Visual Studio警告IDE0006的解决办法
  3. 鸿蒙系统哪里的,华为“鸿蒙系统”IPFS/FIL:区块链的“鸿蒙系统”?
  4. 通过工具SecureCRTPortable将项目部署到服务器上
  5. 使用VMware VSphere WebService SDK进行开发 (三)——获取主机(HostSystem)的基本信息
  6. 容器编排技术 -- Kubernetes 声明网络策略
  7. .NET自动服务程序—C#
  8. python中sys用法_Python中sys模块功能与用法实例详解
  9. luogu P1216 [IOI1994][USACO1.5]数字三角形 Number Triangles (递推)
  10. 【VC++类型转换】string转换为CString
  11. 西农JAVA作业提交系统_Java程序员需要知道的操作系统知识汇总(持续更新)
  12. Axure RP 9 安装、汉化
  13. elsevier模板通讯作者添加脚注的方法[已解决]
  14. c语言return后面有没有分号,为什么末尾加return 0;}反而不能通过?(符号英文半角,分号没漏)...
  15. 重新制定了目标 这样才知道为啥活着 重新起航 星辰大海
  16. Python最简单的图片爬虫,只用20行代码爬遍全网
  17. 采药(洛谷-P1048)
  18. 注册测绘师资格拟认定人员公示名单
  19. android 开源 高斯模糊_Android高斯模糊你所不知道的坑
  20. eclipse启动慢?试试如下操作

热门文章

  1. 从零开始玩转JMX(二)——Condition
  2. 学习Windows编程遇到的问题
  3. 共享经济模式下的边缘计算——PPIO边缘云 laaS技术实践分享
  4. 音视频技术开发周刊 | 133
  5. 「递归」第3集 | 向善的信念,让技术自带光芒
  6. AI商业产品经理:我眼中的AI简史
  7. nginx-rtmp message
  8. 通过 crontab将linux中的top信息写入文件中
  9. HMAC算法及其应用
  10. Java线程池如何合理配置核心线程数