zoukankan      html  css  js  c++  java
  • linux open函数的 mode_t涵义(转)

    打开文件、新建文件和关闭文件操作

    打开文件操作使用系统调用函数open(),该函数的作用是建立一个文件描述符,其他的函数可以通过文件描述符对指定文件进行读取与写入的操作。打开文件的一般形式是:

    1. open(文件路径, 标志); 

    函数的返回值是文件描述符,如果打开文件成功返回一个正整数,否则返回-1。标志是用于指定打开文件操作模式的枚举常量,主标志如表13.1所示。

    表13.1  打开文件操作的主标志

    参    数

    说    明

    参    数

    说    明

    O_RDONLY

    以只读方式打开文件

    O_RDWR

    以可读写方式打开文件

    O_WRONLY

    以只写方式打开文件

     

     


    主标志是互斥的,使用其中一种则不能再使用另外一种。除了主标志以外,还有副标志可与它们配合使用,副标志可同时使用多个,使用时在主标志和副标志之间加入按位与(|)运算符,如表13.2所示。

    表13.2  打开文件操作的副标志

    参    数

    说    明

    O_APPEND

    读写文件从文件尾部开始移动,所写入

    的数据追加到文件尾

    O_TRUNC

    若文件存在并且以可写的方式打开时,

    此标志会将文件长度清为0,而原来存于

    该文件的资料也会消失

    O_CREAT

    若路径中的文件不存在则自动建立该文件

    O_EXCL

    如果与O_CREAT同时设置,此指令会去检

    查文件是否存在,文件若不存在则建立该文

    件,否则将导致打开文件错误。此外,若

    O_CREAT与O_EXCL同时设置,并且将要

    打开的文件为符号连接,则将导致打开文件失败


    新建文件操作是在打开文件操作的函数上加入O_CREAT副标志实现的。当路径中的文件不存在时,则创建一个新文件。创建新文件的同时可设置文件的权限,这时函数需要增加一组实际参数,形式为:

    1. open(文件路径, 标志, 权限标志); 

    文件权限标志如表13.3所示。

    表13.3  文件权限标志

    参    数

    说    明

    参    数

    说    明

    S_IRUSR

    所有者拥有

    读权限

    S_IXGRP

    群组拥有执

    行权限

    S_IWUSR

    所有者拥有

    写权限

    S_IROTH

    其他用户拥

    有读权限

    S_IXUSR

    所有者拥有

    执行权限

    S_IWOTH

    其他用户拥

    有写权限

    S_IRGRP

    群组拥有读权限

    S_IXOTH

    其他用户拥

    有执行权限

    S_IWGRP

    群组拥有写权限

     

     


    文件权限标志也可以使用加权数字表示,这组数字被称为umask变量,它的类型是mode_t,是一个无符号八进制数。umask变量的定义方法如表13.4所示。umask变量由3位数字组成,数字的每一位代表一类权限。用户所获得的权限是加权数值的总和。例如764表示所有者拥有读、写和执行权限,群组拥有读和写权限,其他用户拥有读权限。

    表13.4  umask变量表示方法

    加 权 数 值

    1

    2

    3

    4

    所有者拥有

    读权限

    群组拥有读权限

    其他用户拥

    有读权限

    2

    所有者拥有

    写权限

    群组拥有写权限

    其他用户拥

    有写权限

    1

    所有者拥有

    执行权限

    群组拥有执行权限

    其他用户拥

    有执行权限

    新建文件的另一个函数是creat(),该函数的一般形式是:

    1. creat(路径, umask); 

    当文件被成功创建函数的返回值为0,否则为-1。当文件不需要使用了,则可以使用close()函数关闭文件。关闭文件的一般形式为:close(文件描述符),如果关闭文件成功,close()函数的返回0,否则返回-1。

    下例将演示打开文件、新建文件和关闭文件这3种操作。程序的逻辑为:指定一个路径,如果该文件存在,输出提示信息,关闭该文件;如果该文件不存在,则新建文件并设置文件属性,输出提示信息,然后关闭该文件。完整的代码如下:

    1. #include <fcntl.h>                          // 提供open()函数  
    2. #include <sys/types.h>                      // 提供mode_t类型  
    3. #include <sys/stat.h>                       // 提供open()函数的符号  
    4. #include <unistd.h>                         // 提供close()函数  
    5. #include <stdio.h> 
    6. int main()  
    7. {  
    8.    int f;                                   // 声明变量f,
      用于保存文件标识符  
    9.    const char *f_path = "test";             // 定义路径字符串  
    10.    mode_t f_attrib;                         // 声明mode_t
      型变量,保存文件属性  
    11.    f_attrib = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH;  
    12.                                             // 为umask变量赋值  
    13.    f = open(f_path, O_RDONLY);              // 以只读方式打开文件  
    14.    if (f == -1) {                           // 判断文件是否打开成功  
    15.       f =open(f_path, O_RDWR | O_CREAT, f_attrib);  // 创建新文件  
    16.       if (f != -1)                                  // 
      判断文件创建是否成功  
    17.          puts("创建一个新文件");  
    18.       else {  
    19.          puts("无法创建新文件,程序退出");  
    20.          return 1;  
    21.       }  
    22.    }  
    23.    else  
    24.       puts("文件打开成功");  
    25.    close(f);                                            // 关闭文件  
    26.    return 0;  

    该程序首先判断是否存在文件test,判断的方法是用open()函数打开test文件,如果返回值是-1,则表示该文件不存在(有时候并非如此)。当文件不存在时,使用open()函数创建该文件,并在程序最后关闭。为mode_t型变量f_attrib赋值的方法使用了按位计算操作,将表示文件权限的常量进行按位或计算,计算的结果与八进制数0664相同,如图13.3所示。

                                                                   

    原文:http://book.51cto.com/art/200912/169537.htm

  • 相关阅读:
    Android底层开发之红外遥控驱动移植
    OC的动态继承编译机制
    Android 的Recovery机制
    JStorm中的并行( parallelismction )介绍
    windows编译ffmpeg出现gcc is unable to create an executable file 的普通情况
    Yii2高速构建RESTful Web服务功能简单介绍
    APK防反编译技术
    Partition(hdu4651)2013 Multi-University Training Contest 5----(整数拆分一)
    JSP简单练习-上传文件
    ios+openflow 问题
  • 原文地址:https://www.cnblogs.com/infiniti/p/2946998.html
Copyright © 2011-2022 走看看