unix环境高级编程(第三版)--fcntl函数

作用:

可以改变已经打开文件的属性

 

函数原型:

#include<fcntl.h>

Int fcntl(int fd, int cmd,, .., /*int arg*/);

返回值,若成功,则依赖于cmd,若出错,返回-1

 

fcntl函数有5种功能:

  1. 复制一个现有的描述符(cmd=F_DUPFD).
  2. 获得/设置文件描述符标记(cmd=F_GETFDF_SETFD).
  3. 获得/设置文件状态标记(cmd=F_GETFLF_SETFL).
  4. 获得/设置异步I/O所有权(cmd=F_GETOWNF_SETOWN).
  5. 获得/设置记录锁(cmd=F_GETLK , F_SETLKF_SETLKW).

 

下面四个命令(cmd)有特定的返回值

F_DUPFD,F_GETFD,F_GETFL,F_GETOWN

第一个命令返回新的文件描述符,第2和第3个命令返回相应的标志,这里的相应的标志指的就是open函数中的状态,最后一个命令返回一个正的进程ID或符的进程组ID

 

例子:

Int val = fcntl(atoi(argv[1], F_GETFL, 0))

中间的参数F_GETFL是有特殊返回值的

这里的val虽然是整形,但是不能直接用

三个访问标志位(O_RDONLYO_WRONLYO_RDWR)并不各占一位

3种标志的值分别是0,1,2,由于历史原因,这三种值是互斥

因此首先必须用屏蔽字O_ACCMODE获取访问模式位,然后将结果与这三种值中的任一种做比较。

访问标志位不止上面这三个,字面这些在open函数中可以设置的参数也可以检测出来

O_APPENDO_NONBLOCKO_SYNC

O_DSYNCO_RSYNCO_FSYNC,O_ASYNC

 

例子

switch(val & O_ACCMODE){

case O_RDONLY:

        printf("read only");

        break;

case O_WRONLY:

        printf("write only");

        break;

case O_RDWR:

      printf("read write");

      break;

default:

      printf("unknown access mode");

      break;

}



if(val & O_APPEND){

      printf(",append");

}

if(val & O_NONBLOCK){

      printf(",nonblock");

}

感觉val和一个概念很像,就是管理空闲存储空间的位置图,看哪块被没被占用直接用二进制比较一下就行了,这个也是比较,不过好像具体实现不是这样的,还没来得及细查,留个坑以后填

 

F_SETFL

然后F_SETFL的时候也是一样的

先获取到原先的val,再把想加的状态“与”进去,最后把新的val设置成文件的状态

int val = fcntl(fd, F_GETFL, 0);

val |= flags;

fcntl(fd, F_SETFL, val);

猜你喜欢

转载自blog.csdn.net/qq_24889575/article/details/81173363