#include <unistd.h>
#include <fcntl.h>
int fcntl(int fd, int cmd, ... );
参数:
fd:表示需要操作的文件描述符
cmd:表示对文件描述符进行如何操作
1.F_DUPFD:复制文件描述符,复制的是第一个参数fd,得到一个新的文件描述符
int ret = fcntl(fd,F_DUPFD);
2.F_GETFL:获取指定的文件描述符状态flag
获取的flag和我们通过open函数传递的flag是一个东西。
3.F_SETFL:设置文件描述符文件状态flag
必选项:O_RDONLY, O_WRONLY, O_RDWR,
可选项:O_CREAT, O_APPEND(表示追加数据), O_NONBLOCK(表示设置成不阻塞)
阻塞和非阻塞:描述的是函数调用的行为。
#include <unistd.h>
#include <fcntl.h>
#include<stdio.h>
#include<string.h>
int main() {
//复制文件描述符
int fd = open("a.txt", O_RDWR);
int ret = fcntl(fd, F_DUPFD);
printf("fd: %d\n", fd);
close(fd);
//修改或者获取文件状态的flag
int fd1 = open("a.txt", O_RDWR);
if(fd1 == -1) {
perror("open");
return -1;
}
printf("fd1: %d\n", fd1);
//获取文件描述符状态flag
int flag = fcntl(fd1, F_GETFL);
if(flag == -1) {
perror("fcntl");
return -1;
}
//修改文件描述符状态的flag,
flag |= O_APPEND;
int ret1 = fcntl(fd1, F_SETFL, flag);
if(ret1 == -1) {
perror("fcntl");
return -1;
}
char* str = "nihao";
write(fd1, str, strlen(str));
close(fd1);
return 0;
}