系统编程-文件IO-fcntl系统调用

 

原型:

#include <unistd.h>
#include <fcntl.h>

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

功能: 改变已经打开文件的性质

 

常见使用方式:

int fcntl(int fd, int cmd);

int fcntl(int fd, int cmd, long arg);

int fcntl(int fd, int cmd, struct flock*lock);

*复制一个已有的文件描述符,新文件描述符作为函数返回值(cmd=F_DUPFD)

*获得/设置文件描述符标志(cmd=F_GETFD或F_SETFD)

*获得/设置文件状态标志(cmd=F_GETFL或F_SETFL)

       通过第三个参数来设置

  可以更改的几个标志是:O_APPEND、O_NONBLOCK、SYNC、O_ASYNC,

                                            而O_RDONLY、O_WRONLY、O_RDWR不适用(只读状态标志、只写状态标志、读写状态标志,不可以更改,这些只能是在文件打开的时候设置的哦!)

*获得/设置文件锁(cmd=F_SETLK、cmd=F_GETLK、F_SETLKW)

 

文件状态标志设置案例

void set_fl(int fd, int flag){

  int val = fcntl(fd, F_GETFL);

  val |= flag;

  if( fcntl(fd, F_SETFL, val) <0 ){

    fprintf(stderr, "fcntl error:%s \n ", strerror(errno));

  } 

}

void clr_fl(int fd, int flag){

  int val = fcntl(fd, F_GETFL);

  val &= ~flag;

  if( fcntl(fd, F_SETFL, val) <0 ){

    fprintf(stderr, "fcntl error:%s \n ", strerror(errno));

  } 

}

 

 

 

 

 

 

 

 

 

 

 

.

上一篇:进程同步


下一篇:Java FileLock是一个POSIX顾问(fcntl)锁