zoukankan      html  css  js  c++  java
  • fcntl 获取文件状态标志

    int fcntl(int fd,int cmd,...)

      函数fcntl提供了非常丰富的功能。主要依赖于cmd的各种参数:

    1. 复制已有的文件描述符 F_DUPFD,F_DUPFD_CLOEXEC
    2. 获取设置文件描述符的标志 F_GETFD,F_SETFD
    3. 获取设置文件状态标志 F_GETFL,F_SETFL
    4. 获取设置异步IO的所有权 F_GETOWN,F_SETFL
    5. 获取设置记录锁 F_GETLK,F_SETLK,F_SETLKW

      

      当cmd= F_GETFL时,fcntl的功能就是获取fd的文件状态的标志。和其他地方不同的是,这个返回的数值并不是每种标志各占二进制的一位。因为O_RDONLY,O_WRONLY,

    O_RDWR是互斥的状态。在处理返回值时,使用O_ACCMODE宏可以将fd文件的读写状态取出来。

      将O_RDONLY,O_WRONLY,O_RDWR,O_ACCMODE打印出来分别0,1,2,3,用3去位于0,1,2结果很明显。

    DEMO:

      

     1 #include <unistd.h>
     2 #include <fcntl.h>
     3 #include <stdlib.h>
     4 #include <stdio.h>
     5 
     6 int main(int argc,char** argv)
     7 {
     8     if(argc != 2)
     9         return -1;
    10     int fl =0;
    11     if((fl = fcntl(atoi(argv[1]),F_GETFL)) < 0) {
    12         printf("getfl failed.");
    13         exit(-1);
    14     }
    15 
    16     switch (fl & O_ACCMODE) {
    17         case O_RDONLY:
    18             printf("O_RDONLY
    ");
    19             break;
    20         case O_WRONLY:
    21             printf("O_WRONLY
    ");
    22             break;
    23         case O_RDWR:
    24             printf("O_RDWR
    ");
    25             break;
    26     }
    27 
    28     if(fl & O_APPEND)
    29         printf("O_APPEND
    ");
    30     if(fl & O_NONBLOCK)
    31         printf("O_NONBLOCK
    ");
    32     if(fl & O_SYNC)
    33         printf("O_SYNC
    ");
    34     if(fl & O_FSYNC)
    35         printf("O_FSYNC
    ");
    36 
    37 }

    结果:

      

      $a.out 0 < 1.c
    
      O_RDONLY
    
      $a.out 1>1.c
    
      $cat 1.c
    
      O_WRONLY
    
      $a.out 1 1>>1.c
    
      $cat 1.c
    
      O_WRONLY
    
      O_APPEND
    
      $a.out 2 2<>1.c
    
      O_RDWR

       上边使用重定向,0,1分别别重定向到文件。于是对fd GETFL就是对这个文件GETFL。

  • 相关阅读:
    后端结对编程报告(2018.6.6)
    Burn Down Chart(2018.6.4~2018.6.10)
    C#多线程List的非线程安全性
    C#泛型参数多线程与复杂参数多线程
    Java学习之App开发公司手机端设想
    Java学习之SpringBoot整合SSM Demo
    Java学习之Mysql结构优化
    Java学习之Dubbo+ZooKeeper分布式服务Demo
    C# 面向切面编程--监控日志记录方案
    C# 通用类型转换方法
  • 原文地址:https://www.cnblogs.com/ittinybird/p/4461487.html
Copyright © 2011-2022 走看看