C++ fcntl 的作用和用法

fcntl 的作用

fcntl 是一个在 C 和 C++ 编程中用于操作文件描述符的函数。它提供了多种功能,包括获取和设置文件描述符标志、获取和设置文件锁等。fcntl 函数的原型如下:

#include <fcntl.h>
int fcntl(int fd, int cmd, ... /* arg */ );
  • fd 是要操作的文件描述符。
  • cmd 是指定操作的命令。
  • arg 是一个可选参数,根据不同的 cmd 可能需要不同的参数。

常见的 cmd 命令包括:

  • F_GETFL: 获取文件描述符的状态标志。
  • F_SETFL: 设置文件描述符的状态标志。
  • F_GETFD: 获取文件描述符的标志。
  • F_SETFD: 设置文件描述符的标志。
  • F_GETLK: 获取文件锁状态。
  • F_SETLK: 设置文件锁(非阻塞)。
  • F_SETLKW: 设置文件锁(阻塞)。

代码示例

下面是一个使用 fcntl 设置非阻塞模式的示例代码:

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

int main() 
{
    // 打开文件
    int fd = open("testfile.txt", O_RDWR | O_CREAT, 0666);
    if (fd == -1) 
    {
        std::cerr << "Failed to open file: " << strerror(errno) << std::endl;
        return 1;
    }

    // 获取当前文件描述符的状态标志
    int flags = fcntl(fd, F_GETFL, 0);
    if (flags == -1) 
    {
        std::cerr << "Failed to get file flags: " << strerror(errno) << std::endl;
        close(fd);
        return 1;
    }

    // 设置文件描述符为非阻塞模式
    flags |= O_NONBLOCK;
    if (fcntl(fd, F_SETFL, flags) == -1) 
    {
        std::cerr << "Failed to set file flags: " << strerror(errno) << std::endl;
        close(fd);
        return 1;
    }

    std::cout << "File descriptor set to non-blocking mode successfully." << std::endl;

    // 尝试读取文件内容
    char buffer[100];
    ssize_t bytesRead = read(fd, buffer, sizeof(buffer) - 1);
    if (bytesRead == -1) 
    {
        std::cerr << "Failed to read file: " << strerror(errno) << std::endl;
    } 
    else 
    {
        buffer[bytesRead] = '\0'; // null-terminate the buffer
        std::cout << "Read " << bytesRead << " bytes: " << buffer << std::endl;
    }

    // 关闭文件
    close(fd);
    return 0;
}

代码解释

  1. 打开文件

    int fd = open("testfile.txt", O_RDWR | O_CREAT, 0666);
    

    打开或创建名为 testfile.txt 的文件,并返回文件描述符 fd。文件打开模式为读写,权限为 0666(所有用户可读写)。

  2. 获取文件描述符的状态标志

    int flags = fcntl(fd, F_GETFL, 0);
    

    使用 fcntl 函数获取文件描述符 fd 的当前状态标志。

  3. 设置非阻塞模式

    flags |= O_NONBLOCK;
    if (fcntl(fd, F_SETFL, flags) == -1) 
    

    将状态标志设置为非阻塞模式,并使用 fcntl 函数更新文件描述符的状态标志。

  4. 读取文件内容

    ssize_t bytesRead = read(fd, buffer, sizeof(buffer) - 1);
    

    尝试从文件中读取数据。如果文件处于非阻塞模式,并且没有可读数据,read 函数会立即返回而不是阻塞。

  5. 关闭文件

    close(fd);
    

    关闭文件描述符。

运行结果

假设 testfile.txt 中有以下内容:

Hello, World!

运行程序后,输出可能如下:

File descriptor set to non-blocking mode successfully.
Read 13 bytes: Hello, World!

如果文件中没有数据可读,或者文件为空,输出将会显示读取失败的错误信息:

File descriptor set to non-blocking mode successfully.
Failed to read file: Resource temporarily unavailable
  • 11
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Warren++

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值