1、函数原型
#include <unistd.h>
#include <fcntl.h>
int fcntl(int fd, int cmd, ... /* arg */ );
//fd:文件描述符
//cmd对文件进行哪些操作,是一个宏
1、F_DUPFD //文件描述符复制 //整体操作类似于dup2
int fd = open("b.bat",O_CREAT|O_RDONLY);
if( -1 == fd)
perror("错误:"),exit(-1);
dup2(fd,5); //文件描述符5被使用
//指定一个文件描述符5,成功返回5,如果5被使用则返回一个没有被使用的最小的值失败返回-1
int fd2 = fcntl(fd,F_DUPFD,5);
printf("%d\n",fd2); //6
2、F_GETFL获取文件状态标识符(get flag)
//get file stat flag
int flags = fcntl(fd,F_GETFL);
printf("flags = %d\n",flags);
输出为:0
以下为文件的装状态标识符的值
#define O_RDONLY 00
#define O_WRONLY 01
#define O_RDWR 02
#define O_CREAT 0100 /* not fcntl */ //文件创建标识通过fcntl函数获取不到
#define O_EXCL 0200 /* not fcntl */ //通过fcntl函数获取不到
#define O_NOCTTY 0400 /* not fcntl */ //通过fcntl函数获取不到
#define O_TRUNC 01000 /* not fcntl */ //通过fcntl函数获取不到
#define O_APPEND 02000
3、F_SETFL设置文件的状态标识(set flag)
文件状态标识的设置只能对0_APPEND以及几个不常用的宏有效,
F_SETFL对于O_RDONLY\O_WRONLY\O_RDWR无效
int fd = open("a.txt",O_RDONLY|O_APPEND);
int flags = fcntl(fd,F_GETFL);
printf("flags = %d\n",flags); //1025
flags = O_RDWR;
fcntl(fd,F_SETFL,flags);
int fg = fcntl(fd,F_GETFL);
printf("fg = %d\n",fg); //1