当前位置:  开发笔记 > 编程语言 > 正文

是否有任何普通的理由使用open()而不是fopen()?

如何解决《是否有任何普通的理由使用open()而不是fopen()?》经验,为你挑选了2个好方法。

经过相当长的一段时间后,我正在用C做一个小项目.这些碰巧包括一些文件处理.我在各种文档中注意到有返回FILE *句柄的函数和返回(小整数)描述符的其他函数.这两组功能都提供了我需要的相同基本服务,所以我使用它并不重要.

但我对收藏智慧感到好奇:使用fopen()和朋友,还是open()朋友更好?

编辑因为有人提到缓冲与未缓冲和访问设备,我应该补充说,这个小项目的一部分将在FUSE下编写用户空间文件系统驱动程序.因此,文件级访问可以像在"文件"(即图像)上一样容易地在设备(例如CDROM或SCSI驱动器)上.



1> Chris Young..:

如果您坚持使用类似unix的系统,最好使用open(),并且您可能希望:

在文件创建时对unix权限位进行更细粒度的控制.

使用较低级别的函数,如read/write/mmap,而不是C缓冲流I/O函数.

使用基于文件描述符(fd)的IO调度(轮询,选择等)您当然可以使用fileno()从FILE*获取fd,但必须注意不要将基于FILE*的流函数与基于fd的函数混合使用.

打开任何特殊设备(不是常规文件)

最好使用fopen/fread/fwrite来获得最大的可移植性,因为这些是标准的C函数,我上面提到的函数不是.



2> smcameron..:

"fopen"便携和"开放"的反对意见并非虚假.

fopen是libc的一部分,open是POSIX系统调用.

每个都像他们来自的地方一样便携.

对于fopen'ed文件的i/o是(你必须假设它可能是,并且出于实际目的,它是)由libc缓冲,文件描述符open()'ed不被libc缓冲(它们可能是,通常是缓存在文件系统中 - 但不是你打开的所有东西()都是文件系统上的文件.

有什么意义,例如,像/ dev/sg0这样的设备节点,或者/ dev/tty0 ......你打算做什么?你要在FILE上做一个ioctl*?祝你好运.

也许你想打开像O_DIRECT这样的标志 - 用fopen()没有意义.

推荐阅读
虎仔球妈_459
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有