Linux中open和fopen的区别有哪些

发布时间 - 2022-04-29 00:00:00    点击率:
区别:1、open是UNIX系统调用函数,而fopen是ANSIC标准中的C语言库函数;2、open的移植性没fopen好;3、fopen只能操纵普通正规文件,而open可以操作普通文件、网络套接字等;4、open无缓冲,fopen有缓冲。

本教程操作环境:linux5.9.8系统、Dell G3电脑。

linux系统:open与fopen的区别

1、来源

从来源的角度看,两者能很好的区分开,这也是两者最显而易见的区别:

open是UNIX系统调用函数(包括LINUX等),返回的是文件描述符(f'd),它是文件在文件描述符表里的索引;

fopen是ANSIC标准中的C语言库函数,在不同的系统中应该调用不同的内核api。返回的是一个指向文件结构的指针。 

2、移植性

这一点从上面的来源就可以推断出来,`fopen`是C标准函数,因此拥有良好的移植性;而`open`是UNIX系统调用,移植性有限。如windows下相似的功能使用API函数`CreateFile`。

3、适用范围

open返回文件描述符,而文件描述符是UNIX系统下的一个重要概念,UNIX下的一切设备都是以文件的形式操作。如网络套接字、硬件设备等。当然包括操作普通正规文件(Regular File)。

fopen是用来操纵普通正规文件(Regular File)的。

4、文件IO层次

如果从文件IO的角度来看,前者属于低级IO函数,后者属于高级IO函数。低级和高级的简单区分标准是:谁离系统内核更近。低级文件IO运行在内核态,高级文件IO运行在用户态。

5、缓冲

  • 缓冲文件系统 
    缓冲文件系统的特点是:在内存开辟一个“缓冲区”,为程序中的每一个文件使用;当执行读文件的操作时,从磁盘文件将数据先读入内存“缓冲区”,装满后再从内存“缓冲区”依此读出需要的数据。执行写文件的操作时,先将数据写入内存“缓冲区”,待内存“缓冲区”装满后再写入文件。由此可以看出,内存“缓冲区”的大小,影响着实际操作外存的次数,内存“缓冲区”越大,则操作外存的次数就少,执行速度就快、效率高。一般来说,文件“缓冲区”的大小随机器 而定。fopen, fclose, fread, fwrite, fgetc, fgets, fputc, fputs, freopen, fseek, ftell, rewind等。

  • 非缓冲文件系统 
    缓冲文件系统是借助文件结构体指针来对文件进行管理,通过文件指针来对文件进行访问,既可以读写字符、字符串、格式化数据,也可以读写二进制数据。非缓冲文件系统依赖于操作系统,通过操作系统的功能对文件进行读写,是系统级的输入输出,它不设文件结构体指针,只能读写二进制文件,但效率高、速度快,由于ANSI标准不再包括非缓冲文件系统,因此建议大家最好不要选择它。open, close, read, write, getc, getchar, putc, putchar等。

一句话总结一下,就是open无缓冲,fopen有缓冲。前者与readwrite等配合使用, 后者与fread,fwrite等配合使用。

使用fopen函数,由于在用户态下就有了缓冲,因此进行文件读写操作的时候就减少了用户态和内核态的切换(切换到内核态调用还是需要调用系统调用API:readwrite);

而使用open函数,在文件读写时则每次都需要进行内核态和用户态的切换;

表现为,如果顺序访问文件,fopen系列的函数要比直接调用open系列的函数快;如果随机访问文件则相反。

相关推荐:《Linux视频教程》


# linux  # c语言  # fopen  # fclose  # fgets  # fgetc  # 字符串  # 结构体  # 指针  # windows  # unix  # 文件系统  # 的是  # 操作系统  # 很好  # 它是  # 效率高  # 要比  # 一个重要  # 越大  # 句话 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 如何在云主机快速搭建网站站点?  昵图网官网入口 昵图网素材平台官方入口  php后缀怎么变mp4格式错误_修改扩展名提示格式不对怎么办【技巧】  在Oracle关闭情况下如何修改spfile的参数  高端云建站费用究竟需要多少预算?  如何在阿里云虚拟服务器快速搭建网站?  Laravel的.env文件有什么用_Laravel环境变量配置与管理详解  Windows家庭版如何开启组策略(gpedit.msc)?(安装方法)  C语言设计一个闪闪的圣诞树  Laravel如何实现本地化和多语言支持_Laravel多语言配置与翻译文件管理  深入理解Android中的xmlns:tools属性  高配服务器限时抢购:企业级配置与回收服务一站式优惠方案  Laravel如何使用Livewire构建动态组件?(入门代码)  nodejs redis 发布订阅机制封装实现方法及实例代码  制作企业网站建设方案,怎样建设一个公司网站?  iOS正则表达式验证手机号、邮箱、身份证号等  如何在建站之星网店版论坛获取技术支持?  猪八戒网站制作视频,开发一个猪八戒网站,大约需要多少?或者自己请程序员,需要什么程序员,多少程序员能完成?  油猴 教程,油猴搜脚本为什么会网页无法显示?  家族网站制作贴纸教程视频,用豆子做粘帖画怎么制作?  在线ppt制作网站有哪些软件,如何把网页的内容做成ppt?  Laravel如何发送系统通知?(Notification渠道示例)  Android Socket接口实现即时通讯实例代码  JavaScript数据类型有哪些_如何准确判断一个变量的类型  敲碗10年!Mac系列传将迎来「触控与联网」双革新  Python自然语言搜索引擎项目教程_倒排索引查询优化案例  Laravel中间件如何使用_Laravel自定义中间件实现权限控制  如何在七牛云存储上搭建网站并设置自定义域名?  香港服务器网站搭建教程-电商部署、配置优化与安全稳定指南  无锡营销型网站制作公司,无锡网选车牌流程?  Laravel怎么集成Log日志记录_Laravel单文件与每日日志配置及自定义通道【详解】  Laravel如何连接多个数据库_Laravel多数据库连接配置与切换教程  JavaScript Ajax实现异步通信  html文件怎么打开证书错误_https协议的html打开提示不安全【指南】  Windows10电脑怎么设置虚拟光驱_Win10右键装载ISO镜像文件  MySQL查询结果复制到新表的方法(更新、插入)  JavaScript如何实现类型判断_typeof和instanceof有什么区别  如何自己制作一个网站链接,如何制作一个企业网站,建设网站的基本步骤有哪些?  如何快速搭建虚拟主机网站?新手必看指南  网站建设保证美观性,需要考虑的几点问题!  Python并发异常传播_错误处理解析【教程】  Laravel如何处理表单验证?(Requests代码示例)  武汉网站设计制作公司,武汉有哪些比较大的同城网站或论坛,就是里面都是武汉人的?  中山网站推广排名,中山信息港登录入口?  宙斯浏览器怎么屏蔽图片浏览 节省手机流量使用设置方法  公司网站制作需要多少钱,找人做公司网站需要多少钱?  详解免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)  潮流网站制作头像软件下载,适合母子的网名有哪些?  百度浏览器如何管理插件 百度浏览器插件管理方法  宙斯浏览器视频悬浮窗怎么开启 边看视频边操作其他应用教程