对文件的操作,除了最基本的打开、关闭、读、写、定位之外,还有很多特殊的情况,比如用于沟通应用层与底层驱动之间的ioctl、万能工具箱fcntl、内存映射mmap等等,熟练使用这些API,是日常开发的必备技能。
![系统IO常用的API接口,你认识多少个?会用多少个?新手一定要看](http://www.axjcy.com/uploadfile/202306/a1a5264848e5768.jpg)
一、ioctl()
该函数是沟通应用层和驱动层的有力武器,底层开发人员在为硬件设备编写驱动的时候,常常将某些操作封装为一个函数,并为这些接口提供一个所谓的命令字,应用层开发者可以通过 ioctl() 函数配合命令字,非常迅捷地绕过操作系统中间层层机构直达驱动层,调用对应的功能。
从这个意义上讲,函数 ioctl() 像是一个通道,只提供函数调用路径,具体的功能由所谓命令字决定,下面是函数的接口规范说明:
![系统IO常用的API接口,你认识多少个?会用多少个?新手一定要看](http://www.axjcy.com/uploadfile/202306/0bdf8fea7d1335b.jpg)
二、fcntl()
该函数的名字是 file control 的缩写,顾名思义,它可以用来“控制”文件,与 ioctl 类似,此处的 “控制” 含义广泛,具体内容由其第二个参数命令字来决定,fcntl 接口规范如下:
![系统IO常用的API接口,你认识多少个?会用多少个?新手一定要看](http://www.axjcy.com/uploadfile/202306/5610e59a3fb24f9.jpg)
- 关键点:
- fcntl 是个变参函数,前两个参数是固定的,后续的参数个数和类型取决于 cmd 的具体数值。
- 第二个参数 cmd,称为命令字。
- 命令字有很多,常用的如下:
![系统IO常用的API接口,你认识多少个?会用多少个?新手一定要看](http://www.axjcy.com/uploadfile/202306/26ea3d9a14a3e93.jpg)
从上表可以看出:
- F_DUPFD的功能与dup( )/dup2( )类似。
- 通过F_SETSL/F_GETFL来获取和设置文件status,经常拿来设置文件的阻塞特性。
- 通过F_SETOWN/F_GETOWN来获取和设置套接字触发的信号的属主,网络编程中常见。
![系统IO常用的API接口,你认识多少个?会用多少个?新手一定要看](http://www.axjcy.com/uploadfile/202306/da6b546c7e21a78.jpg)
三、mmap()
该函数全称是 memory map,意为内存映射,即将某个文件与某块内存关联起来,达到通过操作这块内存来间接操作其所对应的文件的效果。
![系统IO常用的API接口,你认识多少个?会用多少个?新手一定要看](http://www.axjcy.com/uploadfile/202306/098c3eb0e98a.jpg)
注意:映射完之后一定要记得取消映射
如何释放内存空间(映射区域):
![系统IO常用的API接口,你认识多少个?会用多少个?新手一定要看](http://www.axjcy.com/uploadfile/202306/e91431acf3af950.jpg)
这几个IO常用的API接口在实际开发中用得非常频繁,开发人员一定要掌握!
度白嵌入,持续分享嵌入式知识,感兴趣可关注,也欢迎大牛来提建议~
相关推荐
文章来源:
丽丽
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至2384272385@qq.com举报,一经查实,本站将立刻删除。