【linuxC语言】fcntl和ioctl函数

文章目录

  • 前言
  • 一、功能介绍
  • 二、具体使用
    • 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 0x12345678int 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.hqwc.cn/news/659965.html

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

相关文章

【安卓13】谷歌桌面Launcher3屏蔽全部应用里面的部分app

1、需求 我们在做谷歌桌面时&#xff0c;移植了一些我们自己的应用&#xff0c;但是有些应用是服务型的app&#xff0c;不需要显示在主页&#xff0c;要隐藏掉 2、解决方案 方法1&#xff1a; 解决办法很简单&#xff0c;阅读源码发现&#xff0c;谷歌桌面添加全部应用的源…

2024年必应bing广告推广开户有什么条件?

必应Bing作为全球领先的搜索引擎之一&#xff0c;其广告平台正为无数企业开辟着新的市场蓝海。如果您正寻求在必应Bing上投放广告&#xff0c;提升品牌影响力和市场份额&#xff0c;那么了解开户条件并找到一位可靠的合作伙伴至关重要。云衔科技&#xff0c;作为数字营销领域的…

Android CalendarView助你打造精美的Android日历应用

Android CalendarView助你打造精美的Android日历应用 1. 引言 移动应用中的日历功能对于用户来说至关重要&#xff0c;它不仅是时间管理的工具&#xff0c;还能帮助用户记录重要事件和安排活动。因此&#xff0c;一个高效、易用的日历控件对于移动应用的成功至关重要。 传统…

场景文本检测识别学习 day06(Vi-Transformer论文精读)

Vi-Transformer论文精读 在NLP领域&#xff0c;基于注意力的Transformer模型使用的非常广泛&#xff0c;但是在计算机视觉领域&#xff0c;注意力更多是和CNN一起使用&#xff0c;或者是单纯将CNN的卷积替换成注意力&#xff0c;但是整体的CNN 架构没有发生改变VIT说明&#x…

《HCIP-openEuler实验指导手册》1.6 Apache静态资源配置(目录访问)

知识点 常用用途&#xff1a; 软件仓库镜像及提供下载服务&#xff1a; 配置步骤 删除网站主目录中的文件&#xff08;本实验机目录为/home/source ip为192.168.12.137 端口为81&#xff09; cd /home/source rm -rf *在主目录中新建6个文件夹如下图 mkdir test{1..6}新建…

情感类ppt素材

小清新手绘插画风毕业季毕业相册同学录画册纪念册PPT下载 - 觅知网这是一张关于清新毕业相册的PPT模板&#xff0c;清新风格设计&#xff0c;加上风为装饰元素&#xff0c;包含毕业相册、毕业季、毕业、同学、纪念等主题内容&#xff0c;也可用作毕业相册PPT、毕业季PPT、毕业P…

【酱浦菌-爬虫项目】爬取学术堂论文信息

1. 首先&#xff0c;代码定义了一个名为 url 的变量&#xff0c;它是一个包含三个网址的集合&#xff08;或者说是一个集合的字典&#xff09;。这些网址分别是&#xff1a; - ‘http://www.xueshut.com/lwtimu/127966.html’ - ‘http://www.xueshut.com/lwtimu/12…

JAVA前端快速入门基础_javascript入门(02)

写在前面:本文用于快速学会简易的JS&#xff0c;仅做扫盲和参考作用 1.JavaScript函数 什么是函数:执行特定任务的代码块 1.1定义&#xff1a; 使用function来进行定义(类似于python里面的def 或者java和c里面的void&#xff0c;int这些返回类型开头)。定义规则如下: func…

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

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

【GAMES 101】图形学入门——着色(Shading)

定义&#xff1a;将不同材质内容应用于不同物体对象上的过程。着色只考虑着色点的存在&#xff0c;不考虑其他物体的遮挡等&#xff0c;因此不考虑阴影处理 一些前期内容的定义&#xff1a; 着色点&#xff08;Shading Point&#xff09;观测方向&#xff08;Viewer Directio…

城会玩,Selenium+Docker成功解决这一大难题

01、需求背景 日常测试中会遇到对web应用进行UI自动化的测试场景&#xff0c;一般常用的工具是使用Selenium&#xff0c;一套简单的UI自动化架构如下&#xff1a; 上图即为简单搭建的一套UI自动化测试架构&#xff0c;但 串行执行测试用例&#xff1a; 一台机器只能安装一个…

第十五届蓝桥杯省赛第二场C/C++B组H题【质数变革】题解

解题思路 首先&#xff0c;我们考虑一下整个数组都是由质数构成的情况。 当我们要将质数 x x x 向后移 k k k 个时&#xff0c;如果我们可以知道质数 x x x 在质数数组的下标 j j j&#xff0c;那么就可以通过 p r i m e s [ j k ] primes[j k] primes[jk] 来获取向后…