zoukankan      html  css  js  c++  java
  • 使用 fcntl 函数 获取,设置文件的状态标志

    前言

      当打开一个文件的时候,我们需要指定打开文件的模式( 只读,只写等 )。那么在程序中如何获取,修改这个文件的状态标志呢?本文将告诉你如何用 fcntl函数 获取指定文件的状态标志。

    解决思路

      1. 对于获取文件状态标志,我们可以通过调用fcntl函数得到一个记录文件标志的整型变量,然后分别让它和各个状态标志常量进行&操作。若操作结果为正则文件具有此状态标志,否则文件没有此状态标志。( 如果是检查只读,只写,可读可写,则需要和ACCMODE相&,然后判断其结果是否为O_RDONLY,O_WRONLY,O_RDWR )。

      2. 对于增加文件状态标志,我们可以先调用fcntl函数得到一个记录文件标志的整型变量,然后让它 |= 你想为其增设的状态标志,最后再调用fcntl函数保存这个标志。

      3. 对于删除文件状态标志,我们可以先调用fcntl函数得到一个记录文件标志的整型变量,然后让它 &= 你想为其增设的状态标志的~,最后再调用fcntl函数保存这个标志。

      PS:调用fcntl函数需要包含 fcntl.h 头文件

    示例代码 - 获取文件的状态标志

     1 #include "apue.h"
     2 #include <fcntl.h>
     3 
     4 int
     5 main(int argc, char *argv[])
     6 {
     7     int        val;
     8 
     9     // 以文件标志符作参数 
    10     if (argc != 2)
    11         err_quit("usage: a.out <descriptor#>");
    12 
    13     // 将字符串类型的文件标志符转换成整型    
    14     if ((val = fcntl(atoi(argv[1]), F_GETFL, 0)) < 0)
    15         err_sys("fcntl error for fd %d", atoi(argv[1]));
    16 
    17     /*
    18      * 下段代码检测标识符对应文件的读写属性
    19     */
    20     switch (val & O_ACCMODE) {
    21     case O_RDONLY:
    22         printf("read only");
    23         break;
    24 
    25     case O_WRONLY:
    26         printf("write only");
    27         break;
    28 
    29     case O_RDWR:
    30         printf("read write");
    31         break;
    32 
    33     default:
    34         err_dump("unknown access mode");
    35     }
    36 
    37     /*
    38      * 下段代码检测标识符对应文件的其他属性
    39     */
    40     if (val & O_APPEND)
    41         printf(", append");
    42     if (val & O_NONBLOCK)
    43         printf(", nonblocking");
    44 
    45 // 对于定义了O_SYNC标志的系统检测该标志
    46 #if defined(O_SYNC)
    47     if (val & O_SYNC)
    48         printf(", synchronous writes");
    49 #endif
    50 #if !defined(_POSIX_C_SOURCE) && defined(O_FSYNC)
    51     if (val & O_FSYNC)
    52         printf(", synchronous writes");
    53 #endif
    54     putchar('
    ');
    55     exit(0);
    56 }

    示例代码 - 增加文件的状态标志

     1 #include "apue.h"
     2 #include <fcntl.h>
     3 
     4 void
     5 set_fl(int fd, int flags) 
     6 {
     7     int        val;
     8 
     9     // 获取记录状态标志的整型变量
    10     if ((val = fcntl(fd, F_GETFL, 0)) < 0)
    11         err_sys("fcntl F_GETFL error");
    12 
    13     // 增加状态标志
    14     val |= flags;        
    15 
    16     // 保存状态标志
    17     if (fcntl(fd, F_SETFL, val) < 0)
    18         err_sys("fcntl F_SETFL error");
    19 }

    示例代码 - 删除文件的状态标志

     1 #include "apue.h"
     2 #include <fcntl.h>
     3 
     4 void
     5 set_fl(int fd, int flags) 
     6 {
     7     int        val;
     8 
     9     // 获取记录状态标志的整型变量
    10     if ((val = fcntl(fd, F_GETFL, 0)) < 0)
    11         err_sys("fcntl F_GETFL error");
    12 
    13     // 删除状态标志
    14     val &= ~flags;        
    15 
    16     // 保存状态标志
    17     if (fcntl(fd, F_SETFL, val) < 0)
    18         err_sys("fcntl F_SETFL error");
    19 }

    说明

      fcntl函数的功能远不及此,其他的功能会随着学习的深入再做讲解。

  • 相关阅读:
    Clojure编写一个阶乘程序 使用递归
    SSH框架学习步骤
    js需要清楚的内存模型
    SeaJS结合javascript面向对象使用笔记(一)
    函数副作用
    linux笔记2
    C#事件与接口编程实例
    C#的接口基础教程之七 覆盖虚接口
    C#的接口基础教程之六 接口转换
    C#的接口基础教程之五 实现接口
  • 原文地址:https://www.cnblogs.com/scut-fm/p/3375177.html
Copyright © 2011-2022 走看看