linux下fcntl的概念和使用

devtools/2025/1/23 14:51:02/

fcntl 是 Linux 系统调用之一,用于执行各种与文件描述符相关的操作。它提供了对打开文件的控制,包括复制文件描述符、设置文件状态标志、获取和设置文件描述符标志等。fcntl 的功能非常广泛,可以用来实现多种不同的任务,如锁文件、更改文件访问模式、复制文件描述符等。

概念

  • 文件描述符(File Descriptor, FD):在 Unix/Linux 系统中,文件描述符是一个非负整数,用于内核追踪一个进程打开的文件或其它 I/O 资源。每个进程都有自己的文件描述符表,而系统也有一个全局的文件表。

  • fcntl 命令(Command)fcntl 函数接收一个命令参数 cmd 来指定要执行的操作。根据这个命令,fcntl 可以执行不同的任务。例如:

    • F_DUPFD:找到比给定值大的最小未使用文件描述符,并将其作为现有描述符的副本返回。
    • F_GETFD 和 F_SETFD:获取和设置文件描述符标志。
    • F_GETFL 和 F_SETFL:获取和设置文件状态标志。
    • F_SETLKF_SETLKW 和 F_GETLK:管理文件上的顾问性锁。

使用方法

设置文件为非阻塞模式

这是一个常见的用例,特别是在网络编程中,当需要处理多个连接时,将套接字设置为非阻塞模式是非常有用的。

#include <unistd.h>
#include <fcntl.h>
#include <stdio.h>int main() {int fd = /* 获取文件描述符 */;// 获取当前的文件状态标志int flags = fcntl(fd, F_GETFL);if (flags == -1) {perror("fcntl F_GETFL");return 1;}// 设置 O_NONBLOCK 标志,使文件描述符变为非阻塞模式if (fcntl(fd, F_SETFL, flags | O_NONBLOCK) == -1) {perror("fcntl F_SETFL");return 1;}printf("File descriptor %d is now in non-blocking mode.\n", fd);// 这里可以进行后续操作...return 0;
}
文件锁定

另一个常见的用法是使用 fcntl 来实现文件锁定,这有助于防止多个进程同时写入同一个文件。

#include <fcntl.h>
#include <sys/types.h>
#include <unistd.h>struct flock lock;
int fd = /* 获取文件描述符 */;// 设置锁
lock.l_type = F_WRLCK;  // 请求写锁
lock.l_whence = SEEK_SET;
lock.l_start = 0;
lock.l_len = 0;         // 锁整个文件if (fcntl(fd, F_SETLK, &lock) == -1) {perror("fcntl F_SETLK");// 如果出错,可能是文件已经被其他进程锁定
}// 解除锁
lock.l_type = F_UNLCK;
fcntl(fd, F_SETLK, &lock);

以上代码片段展示了如何使用 fcntl 来设置文件描述符的属性以及如何应用文件锁定。请确保在实际应用中正确处理错误,并且了解你的程序正在使用的文件描述符是否适合进行这些操作。


http://www.ppmy.cn/devtools/152908.html

相关文章

Spring注解篇:@RestController详解

全文目录&#xff1a; 开篇语前言摘要概述源码解析使用案例分享代码分析使用场景优缺点分析测试用例 应用场景案例优缺点分析核心类方法介绍测试用例测试用例分析使用场景优缺点分析测试用例 小结总结文末 开篇语 哈喽&#xff0c;各位小伙伴们&#xff0c;你们好呀&#xff0c…

工作流引擎Camunda与LiteFlow核心组件对比

以下为 Camunda 7 和 LiteFlow 详细的介绍&#xff0c;包括它们的核心组件和用途。 1. Camunda 7 详细介绍 Camunda 7 是一个基于 BPMN 2.0 标准的企业级工作流和决策自动化平台。它被广泛应用于复杂业务流程的管理和执行&#xff0c;其核心目标是通过流程自动化来提升企业效…

洛谷题目 P1271 【深基9.例1】选举学生会 题解

题目传送门&#xff1a; P1271 【深基9.例1】选举学生会 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 前言: 大家应该都知道&#xff0c;这道题不是很简单吗&#xff1f;就一个排序&#xff0c;就能写完&#xff0c;为什么还写呢&#xff1f;&#xff08;作者心里话&…

linux 根目录下结构

/ 虚拟目录的根的目录&#xff0c;通常不会在这里放置文件 /bin&#xff1a;存放频繁使用的命令,二进制文件&#xff0c;存放了很多用户级的GNU实用工具。 /boot&#xff1a;引导目录&#xff0c;存放引导文件&#xff0c;包含启动Linux所需的核心文件。 /dev&#xff1a;设…

吴恩达深度学习——如何实现神经网络

来自吴恩达深度学习&#xff0c;仅为本人学习所用。 文章目录 神经网络的表示计算神经网络的输出激活函数tanh选择激活函数为什么需要非激活函数双层神经网络的梯度下降法 随机初始化 神经网络的表示 对于简单的Logistic回归&#xff0c;使用如下的计算图。 如果是多个神经元…

AI对齐与开源发展:多学科融合创新之路

标题&#xff1a;AI对齐与开源发展&#xff1a;多学科融合创新之路 文章信息摘要&#xff1a; 本文分析了AI对齐研究中多学科融合的重要性及开源AI领域的最新发展。文章指出&#xff0c;AI对齐问题需要计算机科学与社会选择理论等学科深度结合&#xff0c;特别是在RLHF领域的应…

记录关于postgresql中使用jsonb导致字符串的乱码问题

事情的起因是这样的&#xff0c;之前完成了jsonb的类型转化器配置&#xff0c;在本地也可以正常运行了&#xff0c;结果上了服务器就出现乱码了。 本地线上 明明代码都一样&#xff0c;偏偏 请求获得到的tags不一样 是不是数据库编码问题 这个问题非常好判断&#xff0c;在…

vue3+uniapp开发鸿蒙初体验

去年7月20号&#xff0c;uniapp官网就已经开始支持鸿蒙应用开发了&#xff0c;话不多说&#xff0c;按照现有规则进行配置实现一下鸿蒙开发效果&#xff1b; 本文基于macOS Monterey 版本 12.6.5实现 开发鸿蒙的前置准备 这里就直接说我的版本&#xff1a; DevEco Studio 5.…