linux系统下fcntl函数解析与标准IO函数介绍
发布时间 - 2025-07-17 00:00:00 点击率:次-----今天是最后一篇文章关于linux系统下文件io操作了,从明天起开始写文件属性的文章了,欢迎大家来学习,一起进步。(同时也欢迎大家批评指出错误,我会及时纠正过来的)。
一、fcntl函数解析:
1、函数原型:先用man手册来查看fcntl的用法和原型:
int fcntl(int fd, int cmd, ... /* arg */ )
参数解析:
fd:文件描述。
cmd:操作命令。
arg:供命令使用的参数(其实就是我们指定的那个文件描述符数字大小)
2、我们只以一个cmd参数为例--- F_DUPFD (Duplicate the file descriptor fd using the lowest-numbered available file descriptor greater than or equal to arg. This is different from dup2(2), which uses exactly the file descrip‐tor specified. On success, the new file descriptor is returned);这里主要是说F_DUPFD这个cmd的作用是复制文件描述符(作用类似于dup和dup2),这个命令的功能是从可用的fd数字列表中找一个比arg大或者和arg一样大的数字作为oldfd的一个复制的fd,和dup2有点像但是不同。下面是代码示例:
代码语言:javascript代码运行次数:0运行复制#include#include #include #include #include #define FILENAME "a.txt"int main(void){ int fd1 = -1, fd2 = -1; fd1 = open(FILENAME, O_RDWR | O_CREAT | O_TRUNC, 0644); if (fd1 < 0) { perror("open"); return -1; } printf("fd1 = %d.\n", fd1); fd2 = fcntl(fd1, F_DUPFD, 5); printf("fd2 = %d.\n", fd2); close(fd1); return -1; }
注:fcntl函数的cmd操作命令还有好多,这里只是起一个抛砖引玉的作用,哈哈哈。
二、标准IO介绍:
1、什么是标准IO,什么又是文件IO?
标准IO是C库函数;而文件IO是linux系统的API,API类似于一种接口,是由操作系统提供的(说实话,在这之前,我这个人比较犟,好少会调用api,非得自己写一个函数,这样有的时候累的半死还不一定能够写出来;而直接用官方给的api函数,可以提高开发效率,节省时间,人力,哈哈哈。)
2、库函数比API还有一个优势就是:API在不同的操作系统之间是不能通用的,但是C库函数在不同操作系统中几乎是一样的。【所以C库函数具有可移植性而API不具有可移植性。性能上和易用性上看,C库函数一般要好一些。譬如IO,文件IO是不带缓存的,而标准IO是带缓存的,等到合适的时间,我们的操作系统才会把写在缓冲区里的内容真正搞到下一层去。因此标准IO比文件IO性能要更高(这里的下一层是指硬件层存储区域,而我们的标准IO函数是应用层方面,它先向系统缓冲区操作,然后等待系统里面的write等函数操作,才把数据弄到硬件层上去)。
3、常用标准IO函数介绍:
常见的标准IO库函数有:fopen、fclose、fwrite、fread、ffulsh(刷新标准库函数的缓存,直接写进操作系统的缓冲区中)、fseek(其实在写这个的话,我自己也对这些函数的用法是一脸的懵逼,还是用man手册去查看他们的用法,才稍微基本会用了,所以这里我举一个例子,也是其抛砖引玉的作用);这里以fopen、fclose、fwrite、fread为例:
这里只查看了fopen的使用,更多使用,大家可以用 man 3 + 标准IO函数查看来查看它们各自的具体用法,这里我就不一一介绍了,代码示例:
代码语言:javascript代码运行次数:0运行复制#include// standard input output#include #include #define FILENAME "a.txt"int main(void){ FILE *fp = NULL; size_t len = -1; //int array[10] = {1, 2, 3, 4, 5}; char buf[100] = {0}; fp = fopen(FILENAME, "r+");//r+表示可读可写 if (NULL == fp) { perror("fopen"); exit(-1); } printf("fopen success. fp = %p.\n", fp); // 在这里去读写文件 memset(buf, 0, sizeof(buf));//清除缓存区buf len = fread(buf, 1, 10, fp); // The function fread() reads nmemb items of data, each size bytes long, from the stream pointed to by stream, storing them at the location given by ptr. printf("len = %ld.\n", len); printf("buf is: [%s].\n", buf); fclose(fp); return 0;}
下面是写操作的代码演示:
代码语言:javascript代码运行次数:0运行复制#include// standard input output#include #include #define FILENAME "a.txt"int main(void){ FILE *fp = NULL; size_t len = -1; int array[10] = {3,5,6,6,9}; fp = fopen(FILENAME, "w+"); if (NULL == fp) { perror("fopen"); exit(-1); } printf("fopen success. fp = %p.\n", fp); // 在这里去读写文件 len = fwrite(array, sizeof(int), sizeof(array)/sizeof(array[0]), fp);// sizeof(array)/sizeof(array[0])中sizeo(array)表示总数组的大 小,sizeof(array[0])表示一个元素的大小,所以整个式子表示数组 的元素个数 // The function fwrite() writes nmemb items of data, each size bytes long, to the stream pointed to by stream, obtaining them from the location given by ptr. printf("len = %ld.\n", len); fclose(fp); return 0;}
三、总结:
通过这一段时间的学习,自己已经掌握了基本的文件IO操作了,接下来还是要多多实践来提高自己。
# linux
# 操作系统
# ai
# 标准库
# red
# JavaScript
# fopen
# fclose
# int
# 接口
# using
# this
# 在这
# 抛砖引玉
# 作了
# 欢迎大家
# 为例
# 里去
# 类似于
# 下一层
# 他们的
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
JS实现鼠标移上去显示图片或微信二维码
安克发布新款氮化镓充电宝:体积缩小 30%,支持 200W 输出
网页设计与网站制作内容,怎样注册网站?
进行网站优化必须要坚持的四大原则
php结合redis实现高并发下的抢购、秒杀功能的实例
如何快速查询网站的真实建站时间?
如何在腾讯云服务器上快速搭建个人网站?
Claude怎样写结构化提示词_Claude结构化提示词写法【教程】
微信小程序 五星评分(包括半颗星评分)实例代码
Python文件流缓冲机制_IO性能解析【教程】
手机怎么制作网站教程步骤,手机怎么做自己的网页链接?
php读取心率传感器数据怎么弄_php获取max30100的心率值【指南】
微信小程序 wx.uploadFile无法上传解决办法
图册素材网站设计制作软件,图册的导出方式有几种?
如何确保西部建站助手FTP传输的安全性?
网站制作价目表怎么做,珍爱网婚介费用多少?
在线制作视频网站免费,都有哪些好的动漫网站?
如何挑选最适合建站的高性能VPS主机?
详解Android中Activity的四大启动模式实验简述
如何在香港免费服务器上快速搭建网站?
Laravel如何实现多表关联模型定义_Laravel多对多关系及中间表数据存取【方法】
如何获取免费开源的自助建站系统源码?
Laravel Pest测试框架怎么用_从PHPUnit转向Pest的Laravel测试教程
HTML5建模怎么导出为FBX格式_FBX格式兼容性及导出步骤【指南】
Laravel如何配置和使用队列处理异步任务_Laravel队列驱动与任务分发实例
Laravel Debugbar怎么安装_Laravel调试工具栏配置指南
北京网站制作的公司有哪些,北京白云观官方网站?
焦点电影公司作品,电影焦点结局是什么?
Laravel怎么集成Log日志记录_Laravel单文件与每日日志配置及自定义通道【详解】
手机网站制作与建设方案,手机网站如何建设?
谷歌浏览器下载文件时中断怎么办 Google Chrome下载管理修复
如何在云主机上快速搭建网站?
常州企业网站制作公司,全国继续教育网怎么登录?
用yum安装MySQLdb模块的步骤方法
Laravel怎么实现软删除SoftDeletes_Laravel模型回收站功能与数据恢复【步骤】
Windows驱动无法加载错误解决方法_驱动签名验证失败处理步骤
如何在IIS中新建站点并解决端口绑定冲突?
黑客入侵网站服务器的常见手法有哪些?
如何续费美橙建站之星域名及服务?
LinuxCD持续部署教程_自动发布与回滚机制
高配服务器限时抢购:企业级配置与回收服务一站式优惠方案
IOS倒计时设置UIButton标题title的抖动问题
利用vue写todolist单页应用
Laravel怎么实现验证码功能_Laravel集成验证码库防止机器人注册
Laravel如何优雅地处理服务层_在Laravel中使用Service层和Repository层
Laravel N+1查询问题如何解决_Eloquent预加载(Eager Loading)优化数据库查询
网站制作大概要多少钱一个,做一个平台网站大概多少钱?
rsync同步时出现rsync: failed to set times on “xxxx”: Operation not permitted
Laravel如何升级到最新的版本_Laravel版本升级流程与兼容性处理
昵图网官方站入口 昵图网素材图库官网入口


