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\n");
19             break;
20         case O_WRONLY:
21             printf("O_WRONLY\n");
22             break;
23         case O_RDWR:
24             printf("O_RDWR\n");
25             break;
26     }
27
28     if(fl & O_APPEND)
29         printf("O_APPEND\n");
30     if(fl & O_NONBLOCK)
31         printf("O_NONBLOCK\n");
32     if(fl & O_SYNC)
33         printf("O_SYNC\n");
34     if(fl & O_FSYNC)
35         printf("O_FSYNC\n");
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,结果说明了O_ACCMODE可行。

时间: 2024-10-22 04:03:16

fcntl 获取文件状态标志的相关文章

3.5 对一个文件描述符打开一个或多个文件状态标志

lib/setfl.c #include "apue.h" #include <fcntl.h> void set_fl(int fd, int flags) /* flags are file status flags to turn on */ { int val; if ((val = fcntl(fd, F_GETFL, 0)) < 0) err_sys("fcntl F_GETFL error"); val |= flags; /* tu

C语言stat()函数:获取文件状态

相关函数:fstat, lstat, chmod, chown, readlink, utime 头文件:#include<sys/stat.h>  #include<uninstd.h> 定义函数:int stat(const char * file_name, struct stat *buf); 函数说明:stat()用来将参数file_name 所指的文件状态, 复制到参数buf 所指的结构中. 下面是struct stat 内各参数的说明: 1 struct stat {

Windows获取文件状态

在操作一个文件前想要获取当前文件的状态,避免正在打开的文件又再次的打开,代码参考网络以前已经写好,分享于己作为记录,也可作为他人的参考. #region Get file status [DllImport("kernel32.dll")] private static extern IntPtr _lopen(string lpPathName,int iReadWrite); [DllImport("kernel32.dll")] private static

第七篇:使用 fcntl 函数 获取,设置文件的状态标志

前言 当打开一个文件的时候,我们需要指定打开文件的模式( 只读,只写等 ).那么在程序中如何获取,修改这个文件的状态标志呢?本文将告诉你如何用 fcntl函数 获取指定文件的状态标志. 解决思路 1. 对于获取文件状态标志,我们可以通过调用fcntl函数得到一个记录文件标志的整型变量,然后分别让它和各个状态标志常量进行&操作.若操作结果为正则文件具有此状态标志,否则文件没有此状态标志.( 如果是检查只读,只写,可读可写,则需要和ACCMODE相&,然后判断其结果是否为O_RDONLY,O_

SylixOS文件状态获取

文件状态介绍 SylixOS中文件的状态信息包含在stat结构体中,其中包含了文件大小,设备标识符,用户标识符,用户组标识符,文件模式,扩展属性,文件读取或修改的时间戳,链接数量,指向存储该内容的磁盘区块的指针,文件分类等等. SylixOS中维护的stat结构体如图 1.1所示. 图 1.1 stat结构体成员 文件状态获取函数 文件状态获取函数介绍 SylixOS中获取文件状态可以使用stat.lstat和fstat等函数.如图 2.1所示. 图 2.1获取文件状态函数原型 函数fstat原

第九篇:使用 lstat 函数获取文件信息

前言 在之前的文章中,描述过如何用 fcntl 函数改变文件的状态标记.但,文件还有很多信息,如文件类型,权限设置,设备编号,访问时间等等.如果要获取这些信息,则使用函数 lstat 可以轻松达到这个目的. 下面的程序将使用该函数获取文件类型信息并判断它的类型. 但在这之前,先要说明文件信息结构体和文件类型判定宏. 文件信息结构体 调用 lstat 函数将会把指定文件的信息存放到 stat 结构体中,这个结构体的定义大致如下: 文件类型判定宏 文件结构体中的文件类型字段是一个整数,对此,可以使用

【linux c learn 之stat】获取文件的属性

NAME stat 获取文件属性 这个函数位于<sys/stat.h>头文件中 函数原型: int stat(const char *path, struct stat *buf); 参数: path  文件路径+文件名 buf     指向buffer的指针 返回值: -1   遇到错误 0    成功返回 函数作用: 把path文件的信息复制到指针buf所指的结构体中. 描述 stat结构体: struct stat { dev_t st_dev; /* ID of device cont

MFC 获取文件和文件夹的路径

1.获取文件的路径 CFileDialog fileDlg(TRUE); fileDlg.m_ofn.lpstrTitle=L"打开文件"; //fileDlg.m_ofn.lpstrFilter=_T("Program(*.exe)\0*.exe\0All Files(*.*)\0*.*\0\0"); if(IDOK==fileDlg.DoModal()) { LPWSTR lpPathName = fileDlg.m_ofn.lpstrFile; SetDlgI

PHP中获取文件扩展名的N种方法

PHP中获取文件扩展名的N种方法 从网上收罗的,基本上就以下这几种方式: 第1种方法: function get_extension($file) { substr(strrchr($file, '.'), 1); } 第2种方法: function get_extension($file) { return substr($file, strrpos($file, '.')+1); } 第3种方法: function get_extension($file) { return end(expl