C++ fcntl 的作用和用法

C++ fcntl 的作用和用法

  • 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 bufferstd::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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/17953.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用 RT 矩阵进行 3D 点云变换详解(基于 PCL 和 Eigen 库)

在 3D 点云处理中&#xff0c;RT 矩阵是一个常用的工具&#xff0c;用于对点云进行旋转和平移操作。本文将详细介绍 RT 矩阵的概念&#xff0c;并通过一个示例程序演示如何基于 PCL 和 Eigen 库将一帧点云进行矩阵变换再输出。 本教程的示例代码和点云数据可在 GitHub 下载。 什…

多电压档hold扫尾

MMMC下STA收敛更为困难&#xff0c;setup通过DMSA可以很好的得到收敛&#xff1b;但是常规的时序修复工具很难通过工具得到最终clean的时序状态&#xff0c;本文介绍一种多模多角下hold的收敛方法。 该方法主要通过遍历hold路径上多电压setup的余量&#xff0c;支持从前往后和从…

【STM32嵌入式系统设计与开发---传感器拓展】——1_2_蓝牙主从模块_AT配置(HC-05)

一、主机蓝牙设置 # 1、重置模块 ATORGL # 2、设置名字&#xff0c;自己随便设置 ATNAMEMaster # 3、设置连接密码&#xff0c;要和从机一样&#xff0c;密码好像可以不加双引号 ATPSWD"1234" # 4、设置为主机 ROLE 1 为主机 ROLE 0为从机 ATROLE1 # 5、设置波特…

【OpenGL手册14】实例化

目录 一、说明 二、实例化 三、实例化数组 四、小行星带 五、完整代码 六、结论 一、说明 实例化渲染&#xff0c;是用少数数据做模板&#xff0c;实现海量物体渲染的手段方法。用实例化渲染&#xff0c;需要对每个实例产生一定描述数据。如何实现&#xff1f;请看本文下…

用Go实现交替打印数字和字母

引言 在编程的世界里&#xff0c;Go语言以其简洁、高效、并发的特性而广受欢迎。今天&#xff0c;我们将通过一个有趣的小例子——交替打印数字和字母&#xff0c;来一窥Go语言并发编程的魅力。 问题背景 想象一下&#xff0c;我们需要打印一个序列&#xff0c;其中数字和字…

docker-compose 映射端口失败! docker端口映射失败 ,docker映射只能使用老端口,映射无法使用

1. 现象 使用docker-compose 启动项目&#xff0c;发现映射端口出现问题&#xff0c;不能映射端口&#xff01; 如图&#xff1a; 使用原来端口是可以使用的 2. 问题原因&#xff1a; 使用了docker-mode 为host模式&#xff0c;所以不能换端口&#xff0c;只能写为"8086:…

SpringBoot——基于Spring Task实现定时任务

目录 定时任务 项目总结 新建一个SpringBoot项目 pom.xml无需引入依赖 SpringTaskDemo SpringbootSpringtaskApplication启动类 定时任务 在日常的项目开发中&#xff0c;往往会涉及一些需要做到定时执行的代码&#xff0c;例如自动将超过24小时的未付款的订单改为取消状…

【调试笔记-20240522-Windows-WSL 修改已安装发行版名称】

调试笔记-系列文章目录 调试笔记-20240522-Windows-WSL 修改已安装发行版名称 文章目录 调试笔记-系列文章目录调试笔记-20240522-Windows-WSL 修改已安装发行版名称 前言一、调试环境操作系统&#xff1a;Windows 10 专业版调试环境调试目标 二、调试步骤方法一&#xff1a;修…

数字化校园的特征

"数字化校园"是校园信息化进入高级阶段的表现形式&#xff0c;信息技术与教育教育的交融应该更深化。因而&#xff0c;数字化校园应该具以下特征&#xff1a; 1.互联网络高速发展 网络是信息时代的根基&#xff0c;没有网络就无法完成教育信息化的绝大部分作业。数字…

Go Redis 实现邮件群发

一、安装 go get github.com/go-redis/redis/v8二、邮箱服务配置,以QQ邮箱为例 三、示例代码 package mainimport ("context""fmt"redis "github.com/go-redis/redis/v8""gopkg.in/gomail.v2""gopkg.in/ini.v1"&quo…

总结 HTTP 协议的基本格式

一、HTTP 是什么 HTTP ( 全称为 " 超文本传输协议 ") 是一种应用非常广泛的 应用层协议 . HTTP 诞生与 1991 年 . 目前已经发展为最主流使用的一种应用层协议 . HTTP 协议目前有三个大版本: HTTP / 1 和 HTTP / 2 都是基于TCP 传输控制协议传输数据。最新版本的…

Java基础语法---Stringjoiner

Stringjoiner 使用需要加入 import java.util.StringJoiner 构造方法: StringJoiner(CharSequence delimiter) 创建一个 StringJoiner 实例&#xff0c;使用指定的分隔符&#xff0c;前缀和后缀默认为空字符串。 StringJoiner(CharSequence delimiter, CharSequence prefix, C…

60. UE5 RPG 使用场景查询系统(EQS,Environment Query System)实现远程敌人寻找攻击位置

UE的Environment Query System&#xff08;EQS&#xff09;是环境查询系统&#xff0c;它是UE4和UE5中用于AI决策制定过程中的数据采集和处理的一个强大工具。EQS可以收集场景中相关的数据&#xff0c;利用生成器&#xff08;Generator&#xff09;针对用户的测试&#xff08;T…

跳台阶扩展问题

题目链接 f(1) 1f(2) 1 1 2f(3) 1 2 1 4f(4) 1 2 4 1 8 所以 f(n) 2 n − 1 ^{n-1} n−1 import java.util.Scanner;public class Solution {public int jumpFloorII(int target) {return 1 << (target - 1);} }

基于SpringBoot的旅游管理系统

基于SpringBoot的旅游管理系统 旅游管理系统开发技术功能模块代码结构数据库设计运行截图源码获取 旅游管理系统 开发技术 技术&#xff1a;SpringBoot、MyBatis-Plus、MySQL、Beetl、Layui。 框架&#xff1a;基于开源框架Snowy-Layui开发。 工具&#xff1a;IDEA、Navicat等…

ESP32 - Micropython ESP-IDF 双线教程 WIFI (1)

ESP32 - Micropython ESP-IDF 双线教程 WIFI ESP32-WIFI介绍1. 工作模式2. 主要功能3. 编程接口总结 ESP32 - Micropython WIFIESP32-MicroPython Wi-Fi 功能示例代码代码解释注意事项 ESP32中的Wi-Fi功能是其核心特性之一&#xff0c;它基于IEEE 802.11标准&#xff0c;提供了…

Python 读取.shp文件并生成图幅编号

代码适用于需要处理和分析地理空间数据的场景&#xff0c;如城市规划、环境监测或自然资源管理&#xff0c;其中它可以帮助用户读取特定区域的Shapefile文件&#xff0c;确定其地理边界&#xff0c;并基于这些边界计算出按照经纬度5度间隔的图幅编号&#xff0c;进而用于地图制…

django中,无法跳转到请求的html页面?

出现错误&#xff1a; You’re seeing this error because you have DEBUG True in your Django settings file. Change that to False, and Django will display a standard 404 page. 在urls中&#xff0c;注释了系统的默认配置&#xff0c;这时就需要在setting配置文件中&…

HTML <from>表单

定义&#xff1a;<form>元素定义了一个表单&#xff0c;用户可以在表单中输入数据&#xff0c;这些数据可以被提交到服务器。 属性&#xff1a; action&#xff1a;指定表单提交时的目标URL&#xff08;服务器端脚本的地址&#xff09;。 method&#xff1a;定义提交表…

AI爆文写作:使用AI来帮你拆分吧,过程丝滑,效率翻倍:拆选题、拆标题、拆结构、拆逻辑、拆段落、收集素材吧!

文章目录 一、为什么要拆文?二、拆分拆什么?三、怎么拆?**1、拆选题和标题:理解作者意图****2、拆结构:学会谋篇布局****3、拆逻辑:洞察思路观点****4、拆段落:掌握起承转合****5、收集语料,丰富素材库**四、拆分提示词一、为什么要拆文? 新进入某个领域,模仿“过来…