fcntl
(file control)是一个用于操作文件描述符的系统调用,它可以执行一系列的控制操作。主要用途包括复制文件描述符、获取或设置文件状态标志,以及执行各种其他与文件描述符相关的操作。
参数:
fd
:文件描述符,对其进行操作。cmd
:操作命令,指定要执行的操作类型。arg
:根据不同的命令,可能需要提供额外的参数。
1. 复制文件描述符 (F_DUPFD, F_DUPFD_CLOEXEC):
int new_fd = fcntl(old_fd, F_DUPFD, new_min_fd);
获取或设置文件状态标志 (F_GETFL, F_SETFL):
int flags = fcntl(fd, F_GETFL);
flags |= O_NONBLOCK; // 添加非阻塞标志
int ret = fcntl(fd, F_SETFL, flags);
获取或设置文件描述符标志 (F_GETFD, F_SETFD):
int flags = fcntl(fd, F_GETFD);
flags |= FD_CLOEXEC; // 设置文件描述符标志为关闭执行时关闭文件
int ret = fcntl(fd, F_SETFD, flags);
非阻塞 I/O (F_GETFL, F_SETFL):
int flags = fcntl(fd, F_GETFL);
flags |= O_NONBLOCK; // 设置非阻塞 I/O
int ret = fcntl(fd, F_SETFL, flags);
// fctl 复制文件描述符
// 设置文件的状态
/*
#include <unistd.h>
#include <fcntl.h>
int fcntl (int fd ,int cmd,...);
参数:
fd:表示需要操作的文件描述符
cmd: 表示对文件描述符进行如何操作
- F_DUPFD:复制文件描述符,复制的是第一个参数fd,得到一个新的文件描述符(返回值)
int ret = fcntl(fd,F_DUPFD);
- F_GETFL: 获取指定文件描述符文件状态flag
获取的flag和我们通过open函数传递的flag是一个东西
- F_SETFL: 设置文件描述符文件状态flag
必选项:O_RDONLY,O_WRONLY,O_RDWR不可被修改
可选项: O_APPEND 表示追加数据
NONBLOCK 设置成非阻塞
阻塞和非阻塞:描述的是函数的调用行为 add()
*/
#include <unistd.h>
#include <fcntl.h>
#include "stdio.h"
#include "string.h"
int main(){
// 1. 复制文件描述符
// int fd = open("1.txt",O_RDONLY);
// int ret = fcntl(fd,F_DUPFD);
// 2. 修改或者获取文件状态flag
int fd = open("1.txt",O_RDWR);
if(fd==-1){
perror("open");
return -1;
}
// 获取文件描述符状态flag
int flag = fcntl(fd,F_GETFL);
flag |= O_APPEND; // 按位或
// 修改文件描述符的状态flag,给flag加入O_APPEND这个标记
int ret = fcntl(fd,F_SETFL,flag);
if(ret==-1){
perror("fcntl");
}
char *str = "你好";
write(fd,str, strlen(str));
return 0;
}