zoukankan      html  css  js  c++  java
  • 8、【Linux系统编程】open函数和close函数

    一、open函数的使用

      在linux系统中,open函数可以打开或创建一个文件。函数原型如下:

    
    
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <fcntl.h>

    1
    int open(const char *pathname, int flags); 2 int open(const char *pathname, int flags, mode_t mode); 3 返回值:成功返回新分配的文件描述符,出错返回-1并设置errno

      pathname参数是要打开或创建的文件名,和fopen一样,pathname既可以是相对路径也可以是绝对路径。flags参数有一系列常数值可供选择,可以同时选择多个常数用按位或运算符连接起来,所以这些常数的宏定义都以O_开头,表示or。
    必选项:以下三个常数中必须指定一个,且仅允许指定一个

    1 O_RDONLY 只读打开
    2 O_WRONLY 只写打开
    3 O_RDWR 可读可写打开

      以下可选项可以同时指定0个或多个,和必选项按位或起来作为flags参数。可选项有很多,这里只介绍一部分,其它选项可参考open(2)的Man Page:

    1 O_APPEND 表示追加。如果文件已有内容,这次打开文件所写的数据附加到文件的末尾而不覆盖原来的内容。
    2 O_CREAT 若此文件不存在则创建它。使用此选项时需要提供第三个参数mode,表示该文件的访问权限。
    3 O_EXCL 如果同时指定了O_CREAT,并且文件已存在,则出错返回。
    4 O_TRUNC 如果文件已存在,并且以只写或可读可写方式打开,则将其长度截断(Trun-cate)为0字节。
    5 O_NONBLOCK 对于设备文件,以O_NONBLOCK方式打开可以做非阻塞I/O(Nonblock I/O)。

    注意open函数C标准I/O库的fopen函数有些细微的区别:
      以可写的方式fopen一个文件时,如果文件不存在会自动创建,而open一个文件时必须明确指定O_CREAT才会创建文件,否则文件不存在就出错返回。
      以w或w+方式fopen一个文件时,如果文件已存在就截断为0字节,而open一个文件时必须明确指定O_TRUNC才会截断文件,否则直接在原来的数据上改写。
      第三个参数mode指定文件权限,可以用八进制数表示,比如0644表示-rw-r-r–,也可以用S_IRUSR、S_IWUSR等宏定义按位或起来表示,详见open(2)的Man Page。要注意的是,文件权限由open的mode参数和当前进程的umask掩码共同决定。

    二、close函数

    close函数用于关闭一个已打开的文件,函数原型如下:

    1 int close(int fd);
    2 返回值:成功返回0,出错返回-1并设置errno

      参数fd是要关闭的文件描述符。需要说明的是,当一个进程终止时,内核对该进程所有尚未关闭的文件描述符调用close关闭,所以即使用户程序不调用close,在终止时内核也会自动关闭它打开的所有文件。但是对于一个长年累月运行的程序(比如网络服务器),打开的文件描述符一定要记得关闭,否则随着打开的文件越来越多,会占用大量文件描述符和系统资源。
      由open返回的文件描述符一定是该进程尚未使用的最小描述符。由于程序启动时自动打开文件描述符0、1、2,因此第一次调用open打开文件通常会返回描述符3,再调用open就会返回4。可以利用这一点在标准输入、标准输出或标准错误输出上打开一个新文件,实现重定向的功能。例如,首先调用close关闭文件描述符1,然后调用open打开一个常规文件,则一定会返回文件描述符1,这时候标准输出就不再是终端,而是一个常规文件了,再调用printf就不会打印到屏幕上,而是写到这个文件中了。

     【实例】

     1 int main(int argc,char *argv[])
     2 {
     3     int fd;
     4 
     5     if(argc < 2)
     6     {
     7         printf("./app filename
    ");
     8         exit(1);
     9     }
    10     umask(0);//设置权限之前要将默认权限关闭
    11     //创建一个文件,以可读可写方式打开,文件的权限为777
    12     fd = open(argv[1],O_CREAT | O_RDWR,0777);
    13     printf("%d
    ",fd);
    14     close(fd);
    15 
    16     return 0;
    17 }
  • 相关阅读:
    yolo_to_onnx ValueError: need more tan 1 value to unpack
    yolo_to_onnx killed
    C++ 实现二维矩阵的加减乘等运算
    Leetcode 1013. Partition Array Into Three Parts With Equal Sum
    Leetcode 1014. Best Sightseeing Pair
    Leetcode 121. Best Time to Buy and Sell Stock
    Leetcode 219. Contains Duplicate II
    Leetcode 890. Find and Replace Pattern
    Leetcode 965. Univalued Binary Tree
    Leetcode 700. Search in a Binary Search Tree
  • 原文地址:https://www.cnblogs.com/Long-w/p/9436823.html
Copyright © 2011-2022 走看看