#include // 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)
  • #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