【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 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函数是至关重要的一步。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

专业渗透测试 Phpsploit-Framework(PSF)框架软件小白入门教程(一)

本系列课程&#xff0c;将重点讲解Phpsploit-Framework框架软件的基础使用&#xff01; 本文章仅提供学习&#xff0c;切勿将其用于不法手段&#xff01; Phpsploit-Framework&#xff08;简称 PSF&#xff09;框架软件&#xff0c;是一款什么样的软件呢&#xff1f; Phpspl…

[数据结构]———归并排序

具体代码&#xff1a;在gitee仓库&#xff1a;登录 - Gitee.com 目录 ​编辑 1.基本思想&#xff1a; 2. 代码解析 1.分析 2.逻辑图 3.运行结果 1.基本思想&#xff1a; 归并排序&#xff08;MERGE-SORT&#xff09;是建立在归并操作上的一种有效的排序算法,该算法是采用分…

Redis__三大日志

文章目录 &#x1f60a; 作者&#xff1a;Lion J &#x1f496; 主页&#xff1a; https://blog.csdn.net/weixin_69252724 &#x1f389; 主题&#xff1a;Redis__三大日志 ⏱️ 创作时间&#xff1a;2024年04月30日 ———————————————— 对于MySQL来说, 有…

C# WinForm —— 08 Form初始化、布局、注册事件

Form 初始化 Form初始化的时候会调用 Designer.cs 里的 InitializeComponent(); 函数&#xff0c;在InitializeComponent(); 函数里面有Load Form语句时会调用 FrmLogin_Load()函数 Form布局 两种方式&#xff1a; 拖控件到窗体&#xff0c;设置属性在Load事件中写代码添加…

Python梯度提升决策树库之lightgbm使用详解

概要 LightGBM是一个快速、分布式、高性能的梯度提升决策树(Gradient Boosting Decision Tree)库,它在机器学习和数据挖掘领域被广泛应用。本文将介绍LightGBM库的安装方法、主要特性、基本功能、高级功能、以及在实际应用中的场景和总结。 安装 首先,需要安装LightGBM库…

一文读懂:到底什么是SCDN?

最近大家一定经常听到CDN这个词&#xff0c;对于之前没接触过这个行业的人&#xff0c;可能会听的云里雾里&#xff0c;不明所以。 那到底什么是SCDN呢&#xff1f; 简单理解&#xff1a;SCDN数据快递前置仓&#xff1f; SCDN&#xff0c;全称 Secure Content Delivery Networ…

自测痉挛性斜颈的迹象:通过六个动作进行判断【北京仁爱堂】

痉挛性斜颈是一种肌张力障碍性疾病&#xff0c;其主要特征是颈部肌肉群的病理性收缩&#xff0c;导致头颈部姿势异常。为了更好地了解自身的颈部健康状况&#xff0c;我们可以通过以下六个动作进行自测&#xff0c;以判断是否存在痉挛性斜颈的迹象。 一、头颈阵挛性旋转首先&am…

2024网络安全面试问题宝典(4万字)

2024网络安全厂商面试问题宝典(4万字) 目录 评分标准网络基础问题 TCP建立连接要进行3次握手&#xff08;syn-syn&#xff0c;ack-ack&#xff09;&#xff0c;而断开连接要进行4次&#xff08;fin-ack-fin-ack&#xff09;TCP&#xff0c;UDP区别&#xff1a;安全常用的协议…

Jenkins(超详细的Docker安装Jenkins教程!!!)

Jenkins Jenkins&#xff0c;原名 Hudson&#xff0c;2011 年改为现在的名字。它是一个开源的实现持续集成的软件工具。 官方网站&#xff1a;https://www.jenkins.io/ 中文文档&#xff1a;https://www.jenkins.io/zh/ 为什么需要Jenkins&#xff1f; 我们以前写完代码&a…

抖音视频0粉营销推广墙纸,当日收益,第二天提现,日入300

项目简介&#xff1a; 这个项目非常易于执行&#xff0c;主要涉及在抖音平台上分享爱国主题的壁纸&#xff0c;并通过推广相关的小程序来实现盈利。 下 载 地 址 &#xff1a; laoa1.cn/1849.html 项目操作简便&#xff0c;一般只需花费1个小时即可完成&#xff0c;一旦掌…

JAVASCRIPT+PHP+GB2312字库文件实现浏览器LED滚动效果

一、效果 二、源码 1、test_led.html <!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>MATRIX LED</title> <script src"https://cdn.staticfile.net/jquery/1.10.2/jquery.min.js"></script…

VSCode连接远程服务器时卡在审核(check)log.txt和pid.txt

诸神缄默不语-个人CSDN博文目录 VSCode就NM跟SB一样天天搁那儿更新&#xff0c;瞎JB更新&#xff0c;每次更新都要出一次兼容性问题&#xff0c;远程服务器不能连公网就上不去了&#xff0c;也没有显式提示&#xff0c;错误很明显就是在下载不了文件&#xff0c;用VSCode内置的…

Xamarin.Android项目使用ConstraintLayout约束布局

Xamarin.AndroidX.ConstraintLayout Xamarin.Android.Support.Constraint.Layout Xamarin.AndroidX.ConstraintLayout.Solver Xamarin.AndroidX.DataBinding.ViewBinding Xamarin.AndroidX.Legacy.Support.Core.UI Xamarin.AndroidX.Lifecycle.LiveData ![在这里插入图片描述]…

【软件工程】需求分析

目录 前言需求分析需求获取UML概述用例图用例图的组成用例图中的符号和含义包含的两种使用场景 用例图补充&#xff1a;“系统”用例模型建模确定系统参与者确定系统用例 用例文档用例文档组成部分 活动图组成元素初始节点和终点活动节点转换决策与分支、合并分岔与汇合 类图类…

JavaScript:Web APIs(三)

本篇文章的内容包括&#xff1a; 一&#xff0c;事件流 二&#xff0c;移除事件监听 三&#xff0c;其他事件 四&#xff0c;元素尺寸与位置 一&#xff0c;事件流 事件流是什么呢&#xff1f; 事件流是指事件执行过程中的流动路径。 我们发现&#xff0c;一个完整的事件执行…

MySQL技能树学习——数据库组成

数据库组成&#xff1a; 数据库是一个组织和存储数据的系统&#xff0c;它由多个组件组成&#xff0c;这些组件共同工作以确保数据的安全、可靠和高效的存储和访问。数据库的主要组成部分包括&#xff1a; 数据库管理系统&#xff08;DBMS&#xff09;&#xff1a; 数据库管理系…

围绕伦理困境进行深入讨论伦理困境分析与解决方案提出及个人反思

遵循一般咨询伦理的六原则&#xff08;自主、有益、无害、公正、诚信、诚实&#xff09;对五个选项&#xff08;A 评估&#xff0c;B 收益&#xff0c;C 后果&#xff0c;D 责任&#xff0c;E 教育&#xff09;进行评估&#xff0c;可以得出以下结论&#xff1a; A. 评估&…

数据结构与算法-单向环形链表与约瑟夫问题

1.简介 单向环形链表&#xff0c;闭合的形成一个环。 单向环形链表的一个应用场景是约瑟夫问题。 约瑟夫问题为&#xff1a;设编号为1&#xff0c;2&#xff0c;…&#xff0c;n的n个人围坐一圈&#xff0c;约定编号为k(1<k<n)的人从1开始报数&#xff0c;数到m的那个人…

C语言-------实现贪吃蛇小游戏

目录 一、预备知识 1.1 Win32 API介绍 Windows 这个多作业系统除了协调应用程序的执行、分配内存、管理资源之外&#xff0c; 它同时也是一个很大的服务中心&#xff0c;调用这个服务中心的各种服务&#xff08;每一种服务就是一个函数&#xff09;&#xff0c;可以帮应用程…