[Linux Device Driver] 标准IO

本文详细讲解了C语言中文件操作的基石,如fopen/fclose、fgets/fputs等,介绍了不同类型的流(文本与二进制)及其缓存机制,重点讲解了setbuf/setvbuf、fflush和流控制函数。涵盖了如何通过FILE指针管理文件,以及如何正确处理文件操作的边界条件和缓存刷新。

文件类型 bcd_lsp

文件的常见操作:
fopen/fclose
fgets/fputs
fgetc/fputc
fwrite/fread

FILE指针:每个使用的文件都在内存中开辟一段区域,用来存放文件的有关信息,这些信息背包寻到一个结构体中,该结构体的类型由系统定义,取名FILE。

标注Io操作对象是stream,在标准IO中,流由FILE*描述

流又分为文本流(以ascii存放)和二进制流(以二进制存放)

标准i偶的缓存方式分为全缓存,行缓存,不带缓存。

使用函数setbuf() setvbuf()可以更改缓存类型 -IONBF(不缓存) IOLBF(行缓存) FOFBF(全缓存)
不缓存:不阻塞
行缓存:出现\n时,将缓冲区的数据输出
全缓存:只有当数据填充满缓冲区或者退出程序或关闭文件后才会输出。

fflush()函数 强制刷新缓冲区(使用fclose()函数就,即关闭文件后,可强制刷新缓冲区)

1、打开流

FIFE *fopen(const char *path,const char *mode)
FIFE *freopen(const char *path,const char *mode,FIFE *stream) //关闭一个已打开的流,重新新打开一个文件
FIFE *fdopen(int filedes,con char *type)

example : fopen("/home/linux/test/1.c",“w”);

fopen的返回值是打开的文件指针。

2、关闭流

int fclose(FILE *stream);
返回值:成功0,失败EOF,并设置errno

3、读写流

int fgetc(FILE *stream); 返回值:成功返回读取到的字符,失败返回EOF
int fputc(int i,FILE *stream); 返回值:返回写入成功的字符,失败返回EOF

char *fgets(char *s,int size,FILE stream)
作用:从流中读取一个字符,一直遇到"\n"或者读了size-1个字符为止,存储到字符指针s所指的内存区域
返回值:返回
s的地址
char *fputs(const char *s,FILE *stream) 将指针所指向的区域的数据读取到流上

size_t fread(void *ptr,size_t size,size_t nnum,FILE *stream)
size_t fwrite(void *ptr,size_t size,size_t nnum,FILE *stream)

4、操作流

int fseek(FILE *stream,long offset,int where)
long ftell(FIFE *stream) //返回当前的读写位置
void rewind() //将当前的读写位置移到开头

fsetops(FIFE *stream,long *ops) //将读写位置定位到pos位置
fgetops(FIFE *stream,long *ops) //返回当前的读写位置

### Linux PCIe 设备驱动开发教程与文档 #### 开发环境准备 为了在Linux环境中进行PCIe设备驱动程序的开发,开发者需要安装必要的工具链和库文件。通常情况下,这包括但不限于内核源码树以及相应的构建工具。对于基于CDCTL硬件的FPGA核心板/评估板来说,确保所使用的操作系统版本支持该类设备至关重要[^1]。 #### 获取并配置内核源码 可以从官方GNU/Linux发行版获取稳定版次的内核源代码包或者是直接从kernel.org下载最新的稳定发布版本。解压之后进入目录执行`make menuconfig`命令来开启针对特定架构的支持选项,特别是要确认已经启用了对PCI Express子系统的支撑功能。 #### 编写简单的PCIe驱动框架 下面给出一段简化后的C语言代码片段作为创建新模块的基础模板: ```c #include <linux/module.h> #include <linux/kernel.h> #include <linux/init.h> #include <linux/types.h> #include <linux/ioport.h> #include <linux/mm.h> #include <linux/interrupt.h> #include <linux/pci.h> static int __init my_pci_driver_init(void){ printk(KERN_INFO "My PCI Driver Initializing\n"); /* Register the driver with kernel */ return pci_register_driver(&my_pci_driver); } static void __exit my_pci_driver_exit(void){ printk(KERN_INFO "My PCI Driver Exiting\n"); /* Unregister the driver from kernel */ pci_unregister_driver(&my_pci_driver); } module_init(my_pci_driver_init); module_exit(my_pci_driver_exit); MODULE_LICENSE("GPL"); ``` 这段代码定义了一个基本结构用于加载到运行中的Linux系统中去识别连接至总线上的外设节点,并完成初始化过程;当卸载时则会释放资源并注销自己。 #### 调试技巧 利用dmesg查看启动日志信息可以帮助理解当前状态下的行为模式。另外还可以通过/sys/bus/pci/devices路径下访问具体实例属性来进行更深入的研究工作。同时,在实际项目里可能还需要借助如QEMU这样的模拟器来进行前期测试验证逻辑正确与否。 #### 官方参考资料链接 除了上述介绍之外,建议查阅由社区维护的一系列指南性文章,这些资料往往包含了更多实用案例分析和技术细节说明,能够极大地促进学习效率提升。例如,《The Linux Kernel Module Programming Guide》就是一本非常受欢迎的手册之一。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值