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

标签 c file posix libc

在离开 C 语言很长时间后,我正在用 C 语言做一个小项目。这些恰好包括一些文件处理。我在各种文档中注意到,有些函数返回 FILE * 句柄,有些函数返回(小整数)描述符。两组功能都提供了我需要的相同基本服务,所以我使用它真的无关紧要。

但我很好奇收集智慧:使用fopen() 和 friend 更好,还是open() 和 friend 更好?

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

最佳答案

如果您坚持使用类 unix 系统并且您可能喜欢:

  • 对文件创建的 unix 权限位进行更细粒度的控制。
  • 使用较低级别的函数,例如读/写/mmap,而不是 C 缓冲流 I/O 函数。
  • 使用基于文件描述符 (fd) 的 IO 调度(轮询、选择等)您当然可以使用 fileno() 从 FILE * 获取 fd,但必须注意不要将基于 FILE * 的流函数与基于 fd 的函数。
  • 打开任何特殊设备(不是常规文件)

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

关于c - 是否有任何普通理由使用 open() 而不是 fopen()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/544662/

相关文章:

c - 管道实现停留在 dup2 命令

java - 在 Eclipse JAR 导出中包含文本文件?

file - Ada:在 block 语句中写入文件

JavaScript - 使用 HTML5 FileReader 读取文件

sockets - 同步 I/O 会使线程忙碌吗?

c - 如果使用共享内存,进程是否仍然比线程有优势?

在 close(2) 之后调用 fsync(2)

c - C中的向后递归打印

c - 函数声明上的 "Error: array type has incomplete element type"

python - 将 C(或 C++)与 Python 连接起来有哪些不同的选项?