fcntl函数

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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值