【linuxC语言】fcntl和ioctl函数

news2025/1/14 18:05:36

文章目录

  • 前言
  • 一、功能介绍
  • 二、具体使用
    • 2.1 fcntl函数
    • 2.2 ioctl函数
  • 三、拓展:填写arg
  • 总结


前言

在Linux系统编程中,经常会涉及到对文件描述符、套接字以及设备的控制操作。fcntl和ioctl函数就是用来进行这些控制操作的两个重要的系统调用。它们提供了对文件、设备和套接字进行各种操作的接口,为开发者提供了强大的功能,使得他们能够更灵活地控制和管理系统资源。


一、功能介绍

fcntlioctl函数都是用于在Unix/Linux系统中进行对设备、文件描述符或套接字的控制的系统调用。它们的作用是相似的,但用法和适用场景略有不同。

fcntl函数
fcntl函数提供了对文件描述符的各种操作,包括:

复制文件描述符(F_DUPFD):复制一个文件描述符,使得两个文件描述符指向同一个文件表项。
获取/设置文件描述符标志(F_GETFD/F_SETFD):获取或设置文件描述符的标志,例如关闭FD_CLOEXEC标志,使得在exec调用中不关闭文件描述符。
获取/设置文件状态标志(F_GETFL/F_SETFL):获取或设置文件的状态标志,例如非阻塞标志、追加标志等。
获取/设置异步I/O所有权(F_GETOWN/F_SETOWN):获取或设置接收异步I/O事件的进程ID或进程组ID。
取消文件锁(F_SETLK):尝试对文件进行加锁或解锁。
获取/设置记录锁(F_GETLK):获取指定的记录锁信息。

ioctl函数
ioctl函数用于执行设备特定的操作,通常用于与设备驱动程序通信。它的常见用法包括:

设备IO控制:用于对设备进行各种控制操作,如读取设备状态、配置设备参数等。
套接字控制:对套接字进行控制,如获取套接字选项、设置套接字选项等。
文件系统控制:在文件系统上执行特定的控制操作,如获取文件系统信息、设置文件系统参数等。
其他:一些特定的设备或文件系统可能定义了更多的ioctl命令,用于执行特定的操作。

二、具体使用

2.1 fcntl函数

函数原型:

#include <fcntl.h>

int fcntl(int fd, int cmd, ... /* arg */ );

参数:

fd:文件描述符,对应要进行操作的文件或套接字。
cmd:操作命令,指定要执行的操作类型。
arg:可选参数,用于某些操作命令的参数。

返回值的作用:

对于不同的命令,返回值的含义可能不同。一般情况下:
成功:返回值依赖于命令执行的具体情况,可能是一个数值或标志。
失败:返回值为-1,并设置errno以指示错误原因。

示例代码:

#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>

int main() {
    int fd = open("example.txt", O_RDONLY); // 打开文件
    if (fd == -1) {
        perror("open");
        return 1;
    }

    // 获取文件状态标志
    int flags = fcntl(fd, F_GETFL);
    if (flags == -1) {
        perror("fcntl F_GETFL");
        close(fd);
        return 1;
    }

    // 设置文件状态标志为非阻塞模式
    if (fcntl(fd, F_SETFL, flags | O_NONBLOCK) == -1) {
        perror("fcntl F_SETFL");
        close(fd);
        return 1;
    }

    // 其他操作...

    close(fd);
    return 0;
}

在这里插入图片描述

2.2 ioctl函数

函数原型:

#include <sys/ioctl.h>

int ioctl(int fd, unsigned long request, ... /* arg */ );

参数:

fd:文件描述符,对应要进行操作的设备或套接字。
request:控制命令,指定要执行的控制操作类型。
arg:可选参数,用于某些控制命令的参数。

返回值的作用:

对于不同的命令,返回值的含义可能不同。一般情况下:
成功:返回值依赖于命令执行的具体情况,可能是一个数值或标志。
失败:返回值为-1,并设置errno以指示错误原因。
示例代码:

#include <stdio.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <errno.h>

int main() {
    int fd = open("/dev/mydevice", O_RDWR); // 打开设备文件
    if (fd == -1) {
        perror("open");
        return 1;
    }

    // 执行特定的设备控制命令
    int value;
    if (ioctl(fd, MY_DEVICE_IOCTL_COMMAND, &value) == -1) {
        perror("ioctl");
        close(fd);
        return 1;
    }

    // 其他操作...

    close(fd);
    return 0;
}

在这里插入图片描述

注意:示例中的MY_DEVICE_IOCTL_COMMAND是一个自定义的设备控制命令,你需要根据实际情况替换成你的设备所支持的控制命令。

ioctl函数的控制命令通常被定义在特定的头文件中,这些头文件通常是设备驱动程序的头文件或系统调用的头文件。以下是一些常见的ioctl控制命令示例:

设备IO控制命令:用于对设备进行各种控制操作。
TIOCGWINSZ:获取终端窗口大小。
TIOCSWINSZ:设置终端窗口大小。
FIONBIO:设置/清除非阻塞IO标志。
FIOASYNC:启用/禁用异步IO模式。
TIOCNOTTY:取消控制终端。
TIOCSCTTY:设置控制终端。
TIOCGPGRP:获取前台进程组ID。
TIOCSPGRP:设置前台进程组ID。
套接字控制命令:对套接字进行控制。
SIOCGIFADDR:获取接口的IP地址。
SIOCSIFADDR:设置接口的IP地址。
SIOCGIFNETMASK:获取接口的子网掩码。
SIOCSIFNETMASK:设置接口的子网掩码。
SIOCGIFMTU:获取接口的最大传输单元。
SIOCSIFMTU:设置接口的最大传输单元。
SIOCGIFHWADDR:获取接口的硬件地址。
SIOCSIFHWADDR:设置接口的硬件地址。
文件系统控制命令:在文件系统上执行特定的控制操作。
FS_IOC_GETFLAGS:获取文件系统标志。
FS_IOC_SETFLAGS:设置文件系统标志。
FS_IOC_GETVERSION:获取文件系统版本。
FS_IOC_SETVERSION:设置文件系统版本。
其他命令:一些特定的设备或文件系统可能定义了更多的ioctl命令。
HDIO_GETGEO:获取磁盘几何信息。
HDIO_GET_IDENTITY:获取磁盘的身份信息。
CDROM_GET_CAPABILITY:获取光盘驱动器的功能信息。
CDROM_PLAYTRKIND:播放CD中的某一首曲目。
这只是一小部分常见的ioctl命令,实际上每个设备、文件系统或系统调用都可能定义了自己独特的ioctl命令集合。要查看特定设备或文件系统的ioctl命令,你需要查阅相应的文档或头文件。

三、拓展:填写arg

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/ioctl.h>

// 假设设备的控制命令为MY_IOCTL_COMMAND
#define MY_IOCTL_COMMAND 0x12345678

int main() {
    // 打开文件
    int fd = open("example.txt", O_RDWR);
    if (fd == -1) {
        perror("open");
        return 1;
    }

    // 使用fcntl设置文件描述符标志为非阻塞模式
    int flags = fcntl(fd, F_GETFL);
    if (flags == -1) {
        perror("fcntl F_GETFL");
        close(fd);
        return 1;
    }
    if (fcntl(fd, F_SETFL, flags | O_NONBLOCK) == -1) {
        perror("fcntl F_SETFL");
        close(fd);
        return 1;
    }

    // 使用ioctl执行设备控制命令
    int value = 42;
    if (ioctl(fd, MY_IOCTL_COMMAND, &value) == -1) {
        perror("ioctl");
        close(fd);
        return 1;
    }

    // 其他操作...

    close(fd);
    return 0;
}

在这里插入图片描述


总结

通过本文的介绍,我们对fcntl和ioctl函数有了更深入的了解。fcntl函数主要用于对文件描述符的各种操作,包括获取/设置文件状态标志、获取/设置异步I/O所有权、获取/设置文件描述符标志等;而ioctl函数则主要用于执行设备特定的操作,如设备IO控制、套接字控制以及文件系统控制等。这两个函数为Linux系统编程提供了强大的功能和灵活性,使得开发者能够更好地控制和管理系统资源,实现各种复杂的功能。对于想要深入学习Linux系统编程的开发者来说,深入理解和掌握fcntl和ioctl函数是至关重要的一步。

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

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

相关文章

系统评估和优化——Datawhale笔记

评估优化生成部分 在前面的章节中&#xff0c;我们讲到了如何评估一个基于 RAG 框架的大模型应用的整体性能。通过针对性构造验证集&#xff0c;可以采用多种方法从多个维度对系统性能进行评估。但是&#xff0c;评估的目的是为了更好地优化应用效果&#xff0c;要优化应用性能…

Creo Assembly “Save As“时,为什么关联的Drawing无法Save As

问题描述&#xff1a; Creo Assembly 进行“另存为”&#xff0c;勾选了“Copy Drawings”。但操作结果是&#xff0c;该Assembly相关联的Drawing没有被“另存为”。 原因分析&#xff1a; 查看Workspace&#xff0c;发现该Assembly a.asm相关联的Drawing为b.drw&#xff0…

与Apollo共创生态:Apollo 7周年大会带给我的启发和心得

Apollo 7周年大会 前不久的Apollo 7周年大会&#xff0c;吸引到我这个对自动驾驶有着浓厚兴趣的开发者&#xff0c;真的精彩&#xff0c;受益匪浅。Apollo 7周年大会展示了Apollo在自动驾驶领域的创新成果&#xff0c;探讨自动驾驶技术的未来发展趋势&#xff0c;并推动自动驾…

【好书推荐8】《智能供应链:预测算法理论与实战》

【好书推荐8】《智能供应链&#xff1a;预测算法理论与实战》 写在最前面编辑推荐内容简介作者简介目录精彩书摘前言/序言我为什么要写这本书这本书能带给你什么 致谢 &#x1f308;你好呀&#xff01;我是 是Yu欸 &#x1f30c; 2024每日百字篆刻时光&#xff0c;感谢你的陪伴…

想开发一款带有视频通话/共享屏幕功能的产品?那WebRTC是你必须要知道的!

作为一名技术爱好者&#xff0c;我总是对各种协议、各种功能感兴趣&#xff0c;两周前我想为我的开源项目ChatCraft集成视频通话功能&#xff0c;我就开始了对应技术的研究&#xff0c;然后我盯上了WebRTC。在这个研究过程中&#xff0c;我恶补了大量有关WebRTC的知识&#xff…

8.机器学习-十大算法之一朴素贝叶斯(Naive Bayes)算法原理讲解

8.机器学习-十大算法之一朴素贝叶斯&#xff08;Naive Bayes&#xff09;算法原理讲解 一摘要二个人简介三朴素贝叶斯算法简介朴素贝叶斯算法概念贝叶斯方法朴素贝叶斯算法贝叶斯公式 四贝叶斯算法的核心思想&#xff1a;利用贝叶斯定理进行分类五优缺点优点缺点 六朴素贝叶斯原…

从浏览器输入url到页面加载(八)你的web网站有几台服务器?

你有没有想过一个问题&#xff0c;做为一名前端开发&#xff0c;你的网站上线后&#xff0c;准备了几台服务器&#xff1f;前端静态资源用了几台&#xff0c;你调接口的那个后端部署了几台&#xff1f; 目录 1 没接触过这个问题很正常 2 当访问量上升的时候 2.1 提升带宽 …

计算机科学与技术就业方向和前景怎么样

计算机科学与技术专业的就业方向极为广泛&#xff0c;方向可以是软件开发与工程、网络与信息安全、数据科学与大数据分析等&#xff0c;几乎渗透到现代社会的每一个角落。以下是上大学网 &#xff08;www.sdaxue.com)对计算机科学与技术专业一些主要的就业方向及其前景分析&…

GitLab(史上最全GitLab安装使用文章!!!)

GitLab 是一个基于网络的Git仓库管理工具&#xff0c;是开源的。基本每个公司都会有属于自己公司内部的GitLab 官方网站&#xff1a;https://about.gitlab.com/ GitLab文档&#xff1a;https://docs.gitlab.cn/jh/install/requirements.html 安装 所需配置 这里采用Cento…

PHP源码_最新Ai对话系统网站源码 ChatGPT+搭建教程+前后端

基于ChatGPT开发的一个人工智能技术驱动的自然语言处理工具&#xff0c;它能够通过学习和理解人类的语言来进行对话&#xff0c;还能根据聊天的上下文进行互动&#xff0c;真正像人类一样来聊天交流&#xff0c;甚至能完成撰写邮件、视频脚本、文案、翻译、代码&#xff0c;写论…

Cloudflare防火墙其他WAF设置

其他WAF设置 缓存设置 缓存设置好也可以帮助我们抵挡巨量的CC攻击。有些CC是很多IP随即攻击一个地址&#xff0c;如果我们的安全策略没有拦截到攻击。但是我们设置了缓存&#xff0c;那这些请求则会在CloudFlare边缘节点直接将缓存内容返回给请求。也达到了抗攻击的效果。 缓…

13.4.1 实验1:配置VTP

1、使用目的 通过本实验可以掌握 VTP三种模式的区别。VTP工作原理。VTP的配置和调试方法 2、实验拓扑 配置VTP的实验拓扑如下图所示 3、实验拓扑 3.1、实验准备 通过命令 delete nash:van.dat和erasestartup-config把3台交换机的配置清除干净&#xff0c;重启交换机&#…

基于深度学习的3D目标检测与跟踪

目标检测和跟踪对于自动驾驶来说是至关重要和基础的任务&#xff0c;旨在从场景中识别和定位出那些预定义类别的对象。在所有形式的自动驾驶数据中&#xff0c;3D点云学习引起了越来越多的关注。目前&#xff0c;有许多用于3D目标检测的深度学习方法。然而&#xff0c;鉴于点云…

MySQL数据库——事务操作-begin-commit-rollback

schooldb库——utf8字符集——utf8_general_ci排序规则 先创建库&#xff0c;再去使用下列的DDL语句。 DDL CREATE TABLE student (id int(11) NOT NULL AUTO_INCREMENT COMMENT 学号,createDate datetime DEFAULT NULL COMMENT 创建时间,modifyDate datetime DEFAULT NULL …

stm32单片机开发一、中断之外部中断实验

stm32单片机的外部中断和定时器中断、ADC中断等都由stm32的内核中的NVIC模块控制&#xff0c;stm32的中断有很多中&#xff0c;比如供电不足中断&#xff0c;当供电不足时&#xff0c;会产生的一种中断&#xff0c;这么多中断如果都接在CPU上&#xff0c;或者说CPU去处理&#…

【LAMMPS学习】八、基础知识(5.2)粒度模型

8. 基础知识 此部分描述了如何使用 LAMMPS 为用户和开发人员执行各种任务。术语表页面还列出了 MD 术语&#xff0c;以及相应 LAMMPS 手册页的链接。 LAMMPS 源代码分发的 examples 目录中包含的示例输入脚本以及示例脚本页面上突出显示的示例输入脚本还展示了如何设置和运行各…

蓝网科技临床浏览系统 deleteStudy SQL注入漏洞复现(CVE-2024-4257)

0x01 产品简介 蓝网科技临床浏览系统是一个专门用于医疗行业的软件系统,主要用于医生、护士和其他医疗专业人员在临床工作中进行信息浏览、查询和管理。 0x02 漏洞概述 蓝网科技临床浏览系统 deleteStudy接口处SQL注入漏洞,未经身份验证的恶意攻击者利用 SQL 注入漏洞获取…

AI大模型探索之路-训练篇8:大语言模型Transformer库-预训练流程编码体验

系列篇章&#x1f4a5; AI大模型探索之路-训练篇1&#xff1a;大语言模型微调基础认知 AI大模型探索之路-训练篇2&#xff1a;大语言模型预训练基础认知 AI大模型探索之路-训练篇3&#xff1a;大语言模型全景解读 AI大模型探索之路-训练篇4&#xff1a;大语言模型训练数据集概…

Codigger数据篇(下):数据安全的全方位保障

在数字化浪潮中&#xff0c;数据已成为现代企业的核心财富。Codigger作为领先的数据服务平台&#xff0c;深知数据安全对于用户的重要性&#xff0c;因此在深挖数据价值的同时&#xff0c;我们始终坚守数据安全防线。 一、双重加密技术保障 Codigger平台运用先进的加密通信和…

【C/C++】动态内存管理(C:malloc,realloc,calloc,free || C++:new,delete)

&#x1f525;个人主页&#xff1a; Forcible Bug Maker &#x1f525;专栏&#xff1a; C | | C语言 目录 前言C/C内存分布C语言中的动态内存管理&#xff1a;malloc/realloc/realloc/freemallocrealloccallocfree C中的动态内存管理&#xff1a;new/deletenew和delete操作内…