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版本升级流程与兼容性处理  昵图网官方站入口 昵图网素材图库官网入口