zoukankan      html  css  js  c++  java
  • 《UNIX环境高级编程》学习心得 四 文件I/O(一)

    这里说的文件I/O是相对标准I/O来说的。主要介绍在UNIX系统中常用的五个文件I/O函数:open、read、write、lseek、以及close。

    一、open和opennat

    #include <fcntl.h>
    int open(const char *path, int oflag, ... /* mode_t mode */);
    int opennet(int fd, const char *path, int oflag, ... /* mode_t mode */);
                     //返回值:若成功则返回文件描述符,若出错则返回-1.        
    

     大师将最后一个参数写为“...”,说明余下的参数的数量及其类型是可变的,还有一个注释里的参数(mode_t mode),对open函数而言,仅当创建新文件时才会使用最后这个参数。

    这个函数的第一个参数,是 *path,这个参数是要打开或者创建文件的名字,是绝对路径或者相对路径。第二个参数,是这个函数的选项,详情请看书中描述。值得注意的是,有五个选项:O_RDONLY(只读打开)、O_WRONLY(只写打开)、O_RDWR(读、写打开)、O_EXEC(只执行打开)和O_SEARCH(只搜索打开),这五个选项必须要有,而且只能有一个。

    其余的常量则是可选的。

      O_APPEND  每次写时都追加到文件的尾端。

      O_CLOEXEC      把FD_CLOEXEC常量设置为文件描述符标志。

      O_CREAT  若文件不存在,则创建它。使用此选项时,需要第三个参数 mode,用于指定该新文件的访问权限位。

      O_DIRECTORY   如果path引用的不是目录,则出错。

      O_EXCL  如果同时指定了O_CREAT,而文件已经存在,则会出错。用此可以测试一个文件是否存在,如果不存在,则创建此文件。

      O_NOCTTY  如果 path 指的是终端设备,则不将该设备分配为此进程的控制终端。

      O_NOFOLLOW  如果path引用的是一个符号链接,则出错。

      O_NONBLOCK  如果指的是一个 FIFO、一个块特殊文件或一个字符特殊文件,则此选项为文件的本地打开操作和后续的I/O 操作设置非阻塞模式。

      O_SYNC  使每次write等待物理I/O操作完成,包括由write操作引起的文件属性更新所需的I/O。

      O_TRUNC  如果此文件存在,而且为只写或者读写成功打开,则将其长度截短为 0。

      O_TTY_INIT  如果打开一个还未打开的终端设备,设置非标准termios参数值,使其符合Single UNIX Specification。

    openat函数是POSIX.1最新版本新增的函数,为了解决相对路径和绝对路径的问题和TOCTTOU问题。

    例子:我用open以只读形式打开一个名为asamplefile的文件,并且检测它是否存在,若不存在则创建它,若存在,则出错。

    代码如下:

    执行结果如下:

    因为我使用了O_CREAT这个选项,所以需要指定第三个参数,第三个参数是指定新文件的权限位。具体在后面的章节会说明。

    二、creat

    除了用open使用O_CREAT选项以外,还可以用creat函数来创建一个新文件

    #include <fcntl.h>
    
    int creat(const char *path, mode_t mode);
                            //返回值:若成功则返回以只写打开的文件描述符,若出错则返回-1.
    

    此函数等效于:

    open(path, O_WRONLY | O_CREAT | O_TRUNC, mode);用习惯open以后觉得creat很多余= =,不知道是不是我理解有问题。

    三、close

    可调用close函数来关闭一个打开的文件。

    #include <unistd.h>
    
    int close(int fd);
                        //返回值:若成功则返回0,若出错则返回-1.
    

    关闭一个文件时还会释放进程加在这个文件上的所有记录所。

    当一个进程终止时,内核自动关闭它所有打开的文件。

    我觉得打开文件和关闭文件应该成对存在。就好比定界符成对存在一样。

      

  • 相关阅读:
    Robot Framework (十)html基础
    Robot Framework (九)Selenium的安装
    Robot Framework (八)循环&分支
    Robot Framework (七)Keyword 关键字
    约瑟夫环问题的两种解法(详解)
    msdn
    java同一个包中,类之间的的调用
    循环语句中break 与 continue的区别
    memset()函数
    DFS(深搜)算法
  • 原文地址:https://www.cnblogs.com/night163/p/4999005.html
Copyright © 2011-2022 走看看