当前位置: 首页 > news >正文

深入了解fcntl函数:Linux系统编程中的文件控制

文章目录

  • 概述
  • 介绍
    • 函数原型与参数
  • 拓展:fcntl改文件属性
  • 总结

概述

摘要: fcntl函数是Linux系统编程中一个重要的函数,用于对文件描述符进行各种控制操作。本文将详细介绍fcntl函数的原型、各个参数的用法,以及阻塞和非阻塞模式切换的方法,并提供相应的代码示例,帮助读者更好地理解和应用fcntl函数。

介绍

fcntl函数是Linux系统编程中的一个文件控制函数,用于对文件描述符进行各种操作,如文件锁定、文件描述符状态设置等。它的原型如下:

函数原型与参数

#include <fcntl.h>
int fcntl(int fd, int cmd, ...);

fcntl函数接受三个参数:文件描述符fd、控制命令cmd和可选的第三个参数arg。

参数用法

文件描述符fd:需要进行控制的文件描述符。

控制命令cmd:决定了具体的操作。常见的命令有:

F_GETFL:获取文件描述符的状态标志。
F_SETFL:设置文件描述符的状态标志。
F_GETFD:获取文件描述符的文件执行标志。
F_SETFD:设置文件描述符的文件执行标志。
F_SETLK:设置文件锁。
F_GETLK:获取文件锁状态。
可选的第三个参数arg:用于某些控制命令的附加参数,具体取决于cmd的值。

拓展:fcntl改文件属性

fcntl用来改变一个【已经打开】的文件的 访问控制属性
重点掌握两个参数的使用, F_GETFL,F_SETFL

int fcntl(int fd, int cmd, ...)

fd 文件描述符
cmd 命令,决定了后续参数个数

int flgs = fcntl(fd,  F_GETFL);flgs |= O_NONBLOCKfcntl(fd,  F_SETFL, flgs);获取文件状态: F_GETFL设置文件状态: F_SETFL

终端文件默认是阻塞读的,这里用fcntl将其更改为非阻塞读

1.#include <unistd.h>  
2.#include <fcntl.h>  
3.#include <errno.h>  
4.#include <stdio.h>  
5.#include <stdlib.h>  
6.#include <string.h>  
7.  
8.#define MSG_TRY "try again\n"  
9.  
10.int main(void)  
11.{  
12.    char buf[10];  
13.    int flags, n;  
14.  
15.    flags = fcntl(STDIN_FILENO, F_GETFL); //获取stdin属性信息  
16.    if(flags == -1){  
17.        perror("fcntl error");  
18.        exit(1);  
19.    }  
20.    flags |= O_NONBLOCK;  
21.    int ret = fcntl(STDIN_FILENO, F_SETFL, flags);  
22.    if(ret == -1){  
23.        perror("fcntl error");  
24.        exit(1);  
25.    }  
26.  
27.tryagain:  
28.    n = read(STDIN_FILENO, buf, 10);  
29.    if(n < 0){  
30.        if(errno != EAGAIN){          
31.            perror("read /dev/tty");  
32.            exit(1);  
33.        }  
34.        sleep(3);  
35.        write(STDOUT_FILENO, MSG_TRY, strlen(MSG_TRY));  
36.        goto tryagain;  
37.    }  
38.    write(STDOUT_FILENO, buf, n);  
39.  
40.    return 0;  
41.}  

编译运行,结果如下:
在这里插入图片描述

可以看到,是非阻塞读取。

总结

通过详细介绍fcntl函数的原型、参数用法以及阻塞和非阻塞模式切换的方法,我们希望读者能够更好地理解和应用fcntl函数

相关文章:

深入了解fcntl函数:Linux系统编程中的文件控制

文章目录 概述介绍函数原型与参数 拓展&#xff1a;fcntl改文件属性总结 概述 摘要: fcntl函数是Linux系统编程中一个重要的函数&#xff0c;用于对文件描述符进行各种控制操作。本文将详细介绍fcntl函数的原型、各个参数的用法&#xff0c;以及阻塞和非阻塞模式切换的方法&am…...

汇川技术内推码

[庆祝]不一样的内推码[庆祝]&#xff1a;IVSM2R 投递了可以评论下名字&#xff0c;我会帮忙留意进度。 汇尔成川&#xff0c;共赴星海&#xff0c;欢迎加入&#xff0c;职等你来。 嵌入式软硬件&#xff0c;机器人算法&#xff0c;电机控制&#xff0c;通信软件&#xff0c;PLC…...

nacos服务器启动报错集合

报错1 Error creating bean with name ‘user‘: Unsatisfied dependency expressed through field ‘jwtTokenManage 开启鉴权之后&#xff0c;你可以自定义用于生成JWT令牌的密钥&#xff0c;application.properties中的配置信息为&#xff1a; ### Since 1.4.1, worked when…...

C语言_分支和循环语句(2)

文章目录 前言一、for 循环1.1语法1.2 for 语句的循环控制变量1.3 一些 for 循环的变种 二、do ... while()循环2.1 do 语句的语法2.2 do ... while 循环中的 break 和 continue2.3 练习1 **- 计算n的阶乘**2. - **在一个有序数组中查找具体的某个数字 n** 二分查找算法&#x…...

JMeter 接口自动化测试:从入门到精通的完全指南

JMeter 是一个开源的负载测试工具&#xff0c;它可以模拟多种协议和应用程序的负载&#xff0c;包括 HTTP、FTP、SMTP、JMS、SOAP 和 JDBC 等。在进行接口自动化测试时&#xff0c;使用 JMeter 可以帮助我们快速地构建测试用例&#xff0c;模拟多种场景&#xff0c;发现接口的性…...

【Java】集合List的toArray()方法及其重载

在Java中&#xff0c;集合&#xff08;List 接口的实现类&#xff09;提供了一个名为 toArray 的方法&#xff0c;用于将集合中的元素转换成数组。该方法有两个主要的重载形式&#xff0c;分别用于不同的情况。 toArray()重载方法1 <T> T[] toArray(T[] a)这个方法将集…...

Python学习笔记:Requests库安装、通过url下载文件

1.下载安装requests库 在pipy或者github下载&#xff0c;通常是个zip&#xff0c;解压缩后在路径输入cmd&#xff0c;并运行以下代码 Python setup.py install 安装完成后&#xff0c;输入python再输入import requests得到可以判断时候完成安装 2.通过url下载文件 使用的是u…...

git pull --rebase 用法

git pull --rebase git pull --rebase 是 Git 命令中的一个选项&#xff0c;它的作用是在从远程仓库拉取更新时使用 rebase 而不是默认的合并方式。使用这个命令会使您的提交历史更加整洁&#xff0c;因为它将您的本地提交在远程更新之前重新应用到新的提交之上。 这个命令的…...

react antd框架中的徽标获取数据对应状态的数量

实现思路&#xff1a;获取数量的思路是通过filter过滤符合数据来实现。 列表数组.filter(item > item.status 值).length; 例子&#xff1a;以下这个例子是判断data数组中的status中在职的数量。 data.filter((item) > item.status 在职).length 效果展示&#xff…...

【多线程】Thread类的用法

文章目录 1. Thread类的创建1.1 自己创建类继承Thread类1.2 实现Runnable接口1.3 使用匿名内部类创建Thread子类对象1.4 使用匿名内部类创建Runnable子类对象1.5 使用lambda创建 2. Thread常见的构造方法2.1 Thread()2.2 Thread(Runnable target)2.3 Thread(String name)2.4 Th…...

第八章 贪心算法 part03 1005.K次取反后最大化的数组和 134. 加油站 135. 分发糖果 (day34补)

本文章代码以c为例&#xff01; 一、力扣第1005题&#xff1a;K 次取反后最大化的数组和 题目: 给你一个整数数组 nums 和一个整数 k &#xff0c;按以下方法修改该数组&#xff1a; 选择某个下标 i 并将 nums[i] 替换为 -nums[i] 。 重复这个过程恰好 k 次。可以多次选择…...

Android Activity启动过程一:从Intent到Activity创建

关于作者&#xff1a;CSDN内容合伙人、技术专家&#xff0c; 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 &#xff0c;擅长java后端、移动开发、人工智能等&#xff0c;希望大家多多支持。 目录 一、概览二、应用内启动源码流程 (startActivity)2.1 startActivit…...

第9章:聚类

聚类任务 性能度量 距离度量 非度量距离 原型聚类 有很好的统计学上的意义&#xff0c;但是只能找到椭球形的聚类。 密度聚类 层次聚类...

程序员为什么要写bug,不能一次性写好吗?

仅仅听到“Bug”这个词就会让你作为一个开发人员感到畏缩。我们相信&#xff0c;优秀的程序员是那些编写无错误代码的人。随着一些开发人员强调要成为一名零错误程序员&#xff0c;我们进行了更深刻的思考&#xff0c;并发现事实的准确性。 所有制作的软件都应该没有错误。对此…...

Nginx反向代理其他服务

Nginx反向代理 嘿&#xff0c;你的网络遇到了限制&#xff0c;不能直接通过服务的端口进行访问&#xff1f;别担心&#xff0c;我们可以借助Nginx这个超级英雄来解决这个问题&#xff01;让我给你讲讲关于Nginx反向代理的故事吧。 首先&#xff0c;让我们明确一下反向代理的概…...

MQ 简介-RabbitMQ

一. MQ 简介 消息队列作为高并发系统的核心组件之一&#xff0c;能够帮助业务系统结构提升开发效率和系统 稳定性&#xff0c;消息队列主要具有以下特点&#xff1a; 削峰填谷:主要解决瞬时写压力大于应用服务能力导致消息丢失、系统奔溃等问题系统解耦:解决不同重要程度、不…...

强化学习(2)

强化学习(1) 1.多智能体深度强化学习重要性采样 多智能体深度强化学习&#xff08;Multi-Agent Deep Reinforcement Learning&#xff0c;MADRL&#xff09;是指在多智能体环境下使用深度强化学习算法进行协同学习。重要性采样&#xff08;Importance Sampling&#xff09;是…...

Visual Studio 2022的MFC框架——theApp全局对象

我是荔园微风&#xff0c;作为一名在IT界整整25年的老兵&#xff0c;今天我们来重新审视一下Visual Studio 2022下开发工具的MFC框架知识。 MFC中的WinMain函数是如何与MFC程序中的各个类组织在一起的呢&#xff1f;MFC程序中的类是如何与WinMain函数关联起来的呢&#xff1f…...

SpringBoot Cache

一、基本概念 Spring Cache 是一个框架&#xff0c;实现了基于注解的缓存功能&#xff0c;只需要简单地加一个注解&#xff0c;就能实现缓存功能。 Spring Cache 提供了一层抽象&#xff0c;底层可以切换不同的缓存实现&#xff0c;例如&#xff1a; • EHCache • Caffeine …...

vue 简单实验 自定义组件 component

1.代码 <script src"https://unpkg.com/vuenext" rel"external nofollow" ></script> <div id"components-demo"><button-counter></button-counter> </div> <script> // 创建一个Vue 应用 const ap…...

ncmdumpGUI:3分钟解锁网易云音乐NCM加密文件,让音乐自由流动

ncmdumpGUI&#xff1a;3分钟解锁网易云音乐NCM加密文件&#xff0c;让音乐自由流动 【免费下载链接】ncmdumpGUI C#版本网易云音乐ncm文件格式转换&#xff0c;Windows图形界面版本 项目地址: https://gitcode.com/gh_mirrors/nc/ncmdumpGUI 当智能音箱对你说"不…...

[QA]插件式测试用例生成工具:LLM Test Case Tool 的设计与实现

一句话介绍&#xff1a;QA 在需求分析和测试设计中常用的能力沉淀到浏览器插件里&#xff1a;用户在阅读 PRD 时&#xff0c;可以直接在页面右下角调用 Workee&#xff0c;完成摘要、大纲、疑点、测试点、测试用例、UAT 用例和多页面分析。 1. 背景&#xff1a;为什么还需要这个…...

GD32F427以太网通信避坑指南:LAN8720的REF_CLK模式选择与SMI管理接口配置

GD32F427以太网通信避坑指南&#xff1a;LAN8720的REF_CLK模式选择与SMI管理接口配置 在嵌入式系统开发中&#xff0c;以太网通信的稳定性往往决定着整个产品的可靠性。GD32F427作为国产MCU的优秀代表&#xff0c;其内置的ENET控制器配合LAN8720 PHY芯片能够实现高效的网络通信…...

【更新 v 2.7.5 版本】桌面版 Open Claw 本地一键部署指南

✨ 核心亮点 零代码门槛&#xff5c;全程可视化&#xff5c;无需手动配环境&#xff5c;内置所有依赖&#xff5c;28 万 Tokens 额度 &#x1f517; 下载地址 https://xiake.yun/api/download/package/16?promoCodeIV8E496E2F7A &#x1f4dd; 前言 开源圈热门的「数字员…...

对比直接使用厂商API观察通过聚合平台调用的延迟差异

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 对比直接使用厂商API观察通过聚合平台调用的延迟差异 在将大模型集成到应用时&#xff0c;开发者通常会关注API调用的响应速度。聚…...

深入WCH USB主机IP:对比CH58x与CH32系列寄存器差异及CherryUSB适配心得

深入解析WCH USB主机IP&#xff1a;寄存器差异与CherryUSB适配实战 1. WCH USB主机IP架构概览 沁恒微电子&#xff08;WCH&#xff09;的CH58x/CH57x与CH32V/CH32F系列微控制器虽然采用不同的USB主机IP设计&#xff0c;但在协议栈层面保持了高度兼容性。这种设计哲学体现了硬件…...

为什么很多扩音设备总是啸叫?这块语音模组可能就是答案

做过扩音器、对讲机、会议设备的人&#xff0c;大概率都被这些问题折磨过&#xff1a;一开大音量就啸叫环境太吵听不清对讲时回音严重麦克风离远一点声音就没了最近看到一款 A-59F 语音处理模组&#xff0c;思路挺有意思。它把&#xff1a;AI降噪回音消除扩音防啸叫双麦定向拾音…...

Java Map集合详解与实战

集合进阶&#xff08;Map集合&#xff09;一、Map集合1.1 Map概述体系各位同学&#xff0c;前面我们已经把单列集合学习完了&#xff0c;接下来我们要学习的是双列集合。首先我们还是先认识一下什么是双列集合。所谓双列集合&#xff0c;就是说集合中的元素是一对一对的。格式:…...

量子纠缠与动态电路:CHSH不等式在NISQ时代的应用

1. 量子纠缠与CHSH不等式&#xff1a;动态电路性能评估在量子计算领域&#xff0c;高质量的量子纠缠是实现量子优势的关键资源。就像建筑需要坚固的钢筋骨架一样&#xff0c;量子算法依赖于稳定的纠缠态作为其计算基础。然而在当前的NISQ&#xff08;Noisy Intermediate-Scale …...

AutoCAD字体管理终极指南:如何彻底解决字体缺失问题

AutoCAD字体管理终极指南&#xff1a;如何彻底解决字体缺失问题 【免费下载链接】FontCenter AutoCAD自动管理字体插件 项目地址: https://gitcode.com/gh_mirrors/fo/FontCenter 还在为AutoCAD字体缺失问题而烦恼吗&#xff1f;FontCenter是您的专业字体管理解决方案&a…...