Linux中open和fopen的区别是什么

47次阅读
没有评论

共计 1671 个字符,预计需要花费 5 分钟才能阅读完成。

这篇文章主要讲解了“Linux 中 open 和 fopen 的区别是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着丸趣 TV 小编的思路慢慢深入,一起来研究和学习“Linux 中 open 和 fopen 的区别是什么”吧!

区别: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 有缓冲。前者与 read, write 等配合使用,后者与 fread,fwrite 等配合使用。

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

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

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

感谢各位的阅读,以上就是“Linux 中 open 和 fopen 的区别是什么”的内容了,经过本文的学习后,相信大家对 Linux 中 open 和 fopen 的区别是什么这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是丸趣 TV,丸趣 TV 小编将为大家推送更多相关知识点的文章,欢迎关注!

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-08-03发表,共计1671字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)