深入了解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系统编程中的文件控制
文章目录 概述介绍函数原型与参数 拓展:fcntl改文件属性总结 概述 摘要: fcntl函数是Linux系统编程中一个重要的函数,用于对文件描述符进行各种控制操作。本文将详细介绍fcntl函数的原型、各个参数的用法,以及阻塞和非阻塞模式切换的方法&am…...
汇川技术内推码
[庆祝]不一样的内推码[庆祝]:IVSM2R 投递了可以评论下名字,我会帮忙留意进度。 汇尔成川,共赴星海,欢迎加入,职等你来。 嵌入式软硬件,机器人算法,电机控制,通信软件,PLC…...
nacos服务器启动报错集合
报错1 Error creating bean with name ‘user‘: Unsatisfied dependency expressed through field ‘jwtTokenManage 开启鉴权之后,你可以自定义用于生成JWT令牌的密钥,application.properties中的配置信息为: ### 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 是一个开源的负载测试工具,它可以模拟多种协议和应用程序的负载,包括 HTTP、FTP、SMTP、JMS、SOAP 和 JDBC 等。在进行接口自动化测试时,使用 JMeter 可以帮助我们快速地构建测试用例,模拟多种场景,发现接口的性…...
【Java】集合List的toArray()方法及其重载
在Java中,集合(List 接口的实现类)提供了一个名为 toArray 的方法,用于将集合中的元素转换成数组。该方法有两个主要的重载形式,分别用于不同的情况。 toArray()重载方法1 <T> T[] toArray(T[] a)这个方法将集…...
Python学习笔记:Requests库安装、通过url下载文件
1.下载安装requests库 在pipy或者github下载,通常是个zip,解压缩后在路径输入cmd,并运行以下代码 Python setup.py install 安装完成后,输入python再输入import requests得到可以判断时候完成安装 2.通过url下载文件 使用的是u…...
git pull --rebase 用法
git pull --rebase git pull --rebase 是 Git 命令中的一个选项,它的作用是在从远程仓库拉取更新时使用 rebase 而不是默认的合并方式。使用这个命令会使您的提交历史更加整洁,因为它将您的本地提交在远程更新之前重新应用到新的提交之上。 这个命令的…...
react antd框架中的徽标获取数据对应状态的数量
实现思路:获取数量的思路是通过filter过滤符合数据来实现。 列表数组.filter(item > item.status 值).length; 例子:以下这个例子是判断data数组中的status中在职的数量。 data.filter((item) > item.status 在职).length 效果展示ÿ…...
【多线程】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为例! 一、力扣第1005题:K 次取反后最大化的数组和 题目: 给你一个整数数组 nums 和一个整数 k ,按以下方法修改该数组: 选择某个下标 i 并将 nums[i] 替换为 -nums[i] 。 重复这个过程恰好 k 次。可以多次选择…...
Android Activity启动过程一:从Intent到Activity创建
关于作者:CSDN内容合伙人、技术专家, 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 ,擅长java后端、移动开发、人工智能等,希望大家多多支持。 目录 一、概览二、应用内启动源码流程 (startActivity)2.1 startActivit…...
第9章:聚类
聚类任务 性能度量 距离度量 非度量距离 原型聚类 有很好的统计学上的意义,但是只能找到椭球形的聚类。 密度聚类 层次聚类...
程序员为什么要写bug,不能一次性写好吗?
仅仅听到“Bug”这个词就会让你作为一个开发人员感到畏缩。我们相信,优秀的程序员是那些编写无错误代码的人。随着一些开发人员强调要成为一名零错误程序员,我们进行了更深刻的思考,并发现事实的准确性。 所有制作的软件都应该没有错误。对此…...
Nginx反向代理其他服务
Nginx反向代理 嘿,你的网络遇到了限制,不能直接通过服务的端口进行访问?别担心,我们可以借助Nginx这个超级英雄来解决这个问题!让我给你讲讲关于Nginx反向代理的故事吧。 首先,让我们明确一下反向代理的概…...
MQ 简介-RabbitMQ
一. MQ 简介 消息队列作为高并发系统的核心组件之一,能够帮助业务系统结构提升开发效率和系统 稳定性,消息队列主要具有以下特点: 削峰填谷:主要解决瞬时写压力大于应用服务能力导致消息丢失、系统奔溃等问题系统解耦:解决不同重要程度、不…...
强化学习(2)
强化学习(1) 1.多智能体深度强化学习重要性采样 多智能体深度强化学习(Multi-Agent Deep Reinforcement Learning,MADRL)是指在多智能体环境下使用深度强化学习算法进行协同学习。重要性采样(Importance Sampling)是…...
Visual Studio 2022的MFC框架——theApp全局对象
我是荔园微风,作为一名在IT界整整25年的老兵,今天我们来重新审视一下Visual Studio 2022下开发工具的MFC框架知识。 MFC中的WinMain函数是如何与MFC程序中的各个类组织在一起的呢?MFC程序中的类是如何与WinMain函数关联起来的呢?…...
SpringBoot Cache
一、基本概念 Spring Cache 是一个框架,实现了基于注解的缓存功能,只需要简单地加一个注解,就能实现缓存功能。 Spring Cache 提供了一层抽象,底层可以切换不同的缓存实现,例如: • 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…...
用计算机科学与技术的视角,把谈恋爱流程化:构建可运行、可调试、可迭代的情感操作系统
用计算机科学与技术的视角,把谈恋爱流程化:构建可运行、可调试、可迭代的情感操作系统 善灵驿站 成长心理 技术思维深度融合系列 作者:培风图南以星河揽胜 专栏链接:善灵驿站 📌 导读:为什么技术人更需要…...
学浪视频下载终极方案:Fiddler+N_m3u8D联动配置避坑指南
学浪视频高效下载实战:Fiddler与N_m3u8D深度配置指南 在知识付费盛行的时代,学浪平台汇聚了大量优质课程资源。对于需要反复学习或离线观看的用户而言,掌握一套稳定高效的视频下载方法显得尤为重要。本文将深入探讨如何通过Fiddler抓包工具与…...
维普检测升级被卡延毕?2026论文降AI急救包:4招人工微调SOP与5大工具硬核横评
论文初稿快要交了,维普却突然搞了个大动作,把系统给升级了。说实话,这事真挺让人头疼的,有人前两天查还是绿的,以为稳了,结果升级完再一测,AI率直接飙红。 但别慌,也别怀疑自己是不…...
ESP8266轻量协程调度器:零栈LeanTask与确定性多任务设计
1. 项目概述ESP8266Scheduler 是一个专为 ESP8266 平台设计的协作式多任务调度器(Co-operative Multitasking Scheduler),其核心目标是在资源受限的 Wi-Fi SoC 上实现轻量、确定、可预测的任务并发执行模型,同时避免传统抢占式 RT…...
STM32G4基本定时器TIM6/TIM7入门:从CubeMX配置到1秒精准中断(附代码)
STM32G4基本定时器实战:用CubeMX配置TIM6实现精准秒闪LED 第一次拿到STM32G4开发板时,最让人兴奋的莫过于让板载LED按照自己的意愿闪烁。这看似简单的需求,却是理解微控制器定时器系统的绝佳切入点。本文将带您从零开始,通过STM32…...
AI绘画辅助:OpenClaw+ollama-QwQ-32B批量处理Stable Diffusion提示词
AI绘画辅助:OpenClawollama-QwQ-32B批量处理Stable Diffusion提示词 1. 为什么需要AI绘画工作流优化 作为一个经常使用Stable Diffusion进行创作的数字艺术家,我一直在寻找提升工作效率的方法。最让我头疼的不是模型本身,而是如何将脑海中的…...
Arrow终极指南:5步掌握可视化游戏叙事设计工具
Arrow终极指南:5步掌握可视化游戏叙事设计工具 【免费下载链接】Arrow Game Narrative Design Tool 项目地址: https://gitcode.com/gh_mirrors/arrow/Arrow Arrow是一款免费开源的游戏叙事设计工具,专门用于创建互动非线性故事和文本冒险游戏。这…...
别再自己造轮子了!STM32F103 RTC时间戳转换,用标准库<time.h>更香(附完整代码)
STM32F103 RTC时间处理:为什么标准库<time.h>是你的最佳选择 第一次在STM32上实现RTC功能时,我花了整整三天时间调试自己写的时间戳转换算法。直到某个深夜,我才发现原来C标准库早已提供了完美解决方案——那一刻既兴奋又懊恼。如果你也…...
OpenClaw备份与迁移:Qwen3.5-4B-Claude项目环境快速转移
OpenClaw备份与迁移:Qwen3.5-4B-Claude项目环境快速转移 1. 为什么需要备份与迁移方案 上周我的主力开发机突然硬盘故障,导致所有OpenClaw配置和技能丢失。在经历了8小时的手动重建后,我意识到必须建立一套可靠的备份迁移流程。特别是当我们…...
革命性主题建模工具Top2Vec:自动发现隐藏主题的完整指南
革命性主题建模工具Top2Vec:自动发现隐藏主题的完整指南 【免费下载链接】Top2Vec Top2Vec learns jointly embedded topic, document and word vectors. 项目地址: https://gitcode.com/gh_mirrors/to/Top2Vec Top2Vec是一款革命性的主题建模工具࿰…...
