open函数与fopen函数
open函数是Unix下系统调用函数,操作成功返回的是文件描述符,操作失败返回的是-1
fopen是ANSIC标准中C语言库函数,所以在不同的系统中调用不同的内核的API,返回的是一个指向文件结构的指针
open函数没有缓冲,open函数一般和write配合使用
fopen函数有缓冲,fopen函数一般和fwrite配合使用
open函数在Linux下一般用来打开或者创建一个文件
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
// open函数的返回值如果操作成功,它将返回一个文件描述符,如果操作失败,它将返回-1
int open(const char *pathname, int flags);
// pathname->打开的文件路径名,或者文件名
// flags
int open(const char *pathname, int flags, mode_t mode);
flags
- O_RDONLY:只读模式
- O_WRONLY:只写模式
- O_RDWR:可读可写
- O_APPEND 表示追加,如果原来文件里面有内容,则这次写入会写在文件的最末尾。
- O_CREAT 表示如果指定文件不存在,则创建这个文件
- O_EXCL 表示如果要创建的文件已存在,则出错,同时返回 -1,并且修改 errno 的值。
- O_TRUNC 表示截断,如果文件存在,并且以只写、读写方式打开,则将其长度截断为0。
- O_NOCTTY 如果路径名指向终端设备,不要把这个设备用作控制终端。
- O_NONBLOCK 如果路径名指向 FIFO/块文件/字符文件,则把文件的打开和后继 I/O设置为非阻塞模式(nonblocking mode)
mode
#include <sys/stat.h>
// umask函数,它可以为进程设置文件模式创建屏蔽字,并返回之前的值。
mode_t umask(mode_t cmask);
修改进程的umask值并不会影响其父进程的umask值。
并且如果想要新创建文件的访问权限完全由用户决定,那么只需在调用open函数前用umask函数将umask值置为0即可。
umask(0);
open("file1", O_CREAT, 0644);
区别:
1、缓冲文件系统与非缓冲系统的区别
缓冲文件系统(fopen) :在内存为每个文件开辟一个缓存区,当执行读操作,从磁盘文件将数据读入内存缓冲区,装满后从内存缓冲区依次读取数据。写操作同理。
内存缓冲区的大小影响着实际操作外存的次数,缓冲区越大,操作外存的次数越少,执行速度快,效率高。缓冲区大小由机器而定。
借助文件结构体指针对文件管理,可读写字符串、格式化数据、二进制数据。
非缓冲文件系统(open):依赖操作系统功能对文件读写,不设文件结构体指针,只能读写二进制文件。
2、open属于低级IO,fopen属于高级IO
3、open返回文件描述符,属于用户态,读写需进行用户态与内核态切换。
fopen返回文件指针
4、open是系统函数,不可移植
fopen是标准C函数,可移植
5、一般用fopen打开普通文件,open打开设备文件
6、 如果顺序访问文件,fopen比open快
如果随机访问文件,open比fopen快
[原文链接]https://blog.csdn.net/oscarjulia/article/details/72638060