什么是linux设备文件

linux中,设备文件是设备驱动程序的接口,允许应用程序通过标准输入输出系统调用使用其设备驱动程序与设备进行交互。linux系统中有两种常用的设备文件:字符特殊文件和块特殊文件,它们间的区别在于操作系统和硬件读取和写入的数据量。

什么是linux设备文件

本教程操作环境:linux5.9.8系统、Dell G3电脑。

Linux设备文件(Device file)

设备文件概述

在类Unix操作系统中,设备文件或特殊文件是设备驱动程序的接口,出现在文件系统中就好像它是普通文件一样。在MS-DOS,OS / 2和Microsoft Windows中也有特殊文件。 这些特殊文件允许应用程序通过标准输入/输出系统调用使用其设备驱动程序与设备进行交互。使用标准系统调用简化了许多编程任务,并且无论设备的特性和功能如何,都可以实现一致的用户空间I / O机制。

设备文件通常提供与标准设备(如打印机和串行端口)的简单接口,但也可用于访问这些设备(如磁盘分区)上的特定独特资源。此外,设备文件对于访问与任何实际设备(如数据接收器和随机数生成器)无关的系统资源非常有用。

1.png图1 应用程序、块文件、驱动、硬件之间的关系

类Unix操作系统中有两种常用的设备文件,称为字符特殊文件和块特殊文件。它们之间的区别在于操作系统和硬件读取和写入的数据量。 与命名管道不同,它们可以称为设备专用文件,但命名管道并不连接到设备,但也不是普通文件。

在一些类Unix系统中,大多数设备文件作为传统上安装在/ dev的虚拟文件系统的一部分进行管理,可能与控制守护进程相关联,该守护进程在运行时监视硬件添加和删除,对设备文件系统进行相应更改,如果对设备文件系统进行更改的操作不是内核自动完成的,则控制守护进程可能调用系统或用户空间中的脚本来处理特殊设备需求。

FreeBSD和DragonFly BSD实现已经命名了虚拟设备文件系统devfs和关联的守护进程devd。 Linux主要使用称为udev的用户空间实现,但有许多变体。 Darwin以及基于它的macOS等操作系统都有纯粹的基于内核的设备文件系统。

在支持chroot进程隔离的Unix系统中,比如Solaris Containers,通常每个chroot环境都需要它自己的/ dev; 这些安装点将在全局文件系统树中各个节点上的主机操作系统上可见。通过限制将设备节点填充到/ dev的chroot实例中,硬件隔离可以由chroot环境强制实施(程序不能插入硬件,它既不能看到也不能访问名称 – 这是比Unix文件系统权限更强的访问控制形式)。

设备节点对应于操作系统内核已经分配的资源。 Unix通过一个主号码和一个次号码来标识这些资源, 都作为节点结构的一部分存储。 这些编号的分配在不同的操作系统和不同的计算机平台上独特地发生。通常,主号码标识设备驱动程序,次号码标识驱动程序控制的特定设备(可能超出许多设备): 在这种情况下,系统可能会将次号码传递给驱动程序。 但是,在动态分配数字的情况下,情况可能并非如此(例如,在FreeBSD 5及更高版本上)。

与其他特殊文件类型一样,计算机系统使用标准系统调用访问设备节点,并将它们视为普通计算机文件。存在两种标准类型的设备文件; 不幸的是,由于历史原因,他们的名字相当反直觉,因此解释两者之间的差异通常是不正确的。

块文件分类

字符设备(Character devices)

字符特殊文件或字符设备提供无缓冲,直接访问硬件设备。 它们不一定允许程序一次读取或写入单个字符; 这取决于所讨论的设备。 例如,硬盘的字符设备通常会要求所有读写操作都对齐到块边界,并且绝对不允许读取单个字节。

字符设备有时被称为原始设备,以避免围绕一个基于块的硬件的字符设备通常需要程序读取和写入对齐的块的事实混淆。

块设备(Block devices)

巧文书 巧文书

巧文书是一款AI写标书、AI写方案的产品。通过自研的先进AI大模型,精准解析招标文件,智能生成投标内容。

巧文书 61 查看详情 巧文书

块特殊文件或块设备提供对硬件设备的缓冲存取,并提供一些抽象的细节。 与字符设备不同,块设备将始终允许程序员读取或写入任何大小的块(包括单个字符/字节)和任何对齐。缺点是由于块设备被缓冲,编程人员不知道在写入数据从内核的缓冲区传递到实际设备之前需要多长时间,或者实际上两个单独的写入将以什么顺序到达物理设备? 此外,如果相同的硬件暴露字符和块设备,则由于客户端使用字符设备不知道块设备的缓冲区中所做的更改而导致数据损坏的风险。

伪设备(Pseudo-devices)

类Unix系统上的设备节点不一定要与物理设备相对应。缺乏这种对应关系的节点形成了一组伪装置。 它们提供操作系统处理的各种功能。 一些最常用的(基于字符的)伪装置包括:

/ dev / null - 接受并放弃所有输入; 不产生输出(总是在读取时返回文件结束指示)/ dev / zero - 接受并放弃所有输入; 产生连续的NUL(零值)字节流/ dev / full - 读取时会产生连续的NUL(零值)字节流,并在写入时返回“磁盘已满”消息/ dev / random和/ dev / urandom - 它们产生一个可变长度的伪随机数字流。

节点创建

节点由mknod系统调用创建。用于创建节点的命令行程序也称为mknod。 通常的文件系统调用(重命名,取消链接)和命令(mv,rm)可以移动或删除节点。 当复制设备节点时传递选项-R或-a时,cp -l命令会创建一个与原始属性相同的新设备节点。

某些Unix版本包含一个名为makedev或MAKEDEV的脚本,用于在目录/ dev中创建所有必需的设备。 只有在其设备被静态分配主要编号的系统上(例如,通过在其内核模块中对其进行硬编码)才有意义。

块文件命名规则

以下前缀用于/ dev层次结构中某些设备的名称,以标识设备的类型:

lp:行式打印机(比较lp)pt:伪终端(虚拟终端)tty:终端一些额外的前缀已经在一些操作系统中普遍使用: fb:帧缓冲区fd :(平台)软盘,尽管这个缩写也常用来指文件描述符高清:(“经典”)IDE驱动程序(以前用于ATA硬盘驱动器,ATAPI光盘驱动器等)hda:第一个ATA通道上的主设备(通常由主编号3和次编号0标识)hdb:第一个ATA通道上的从属设备hdc:第二个ATA通道上的主设备hdc1:此磁盘上的第一个主分区(示例)hdc5:扩展分区中的第一个逻辑驱动器(示例)hdd:第二个ATA通道上的从属设备parport,pp:并行端口SCSI驱动程序,也被libATA(现代PATA / SATA驱动程序),USB,IEEE 1394等使用。sd:大容量存储驱动程序sda:首次注册的设备sda4:此磁盘上的最后一个分区(示例)sda6:扩展分区中的第二个逻辑驱动器(示例)sdb,sdc等:第二,第三等注册设备ses:机箱驱动程序sg:通用SCSI层sr:“ROM”驱动程序(面向数据的光盘驱动器; scd只是一个辅助别名)st:磁带驱动器tty:终端ttyS :(平台)串口驱动程序ttyUSB:USB串口转换器,调制解调器等

在Linux中使用的前缀规范列表可以在Linux设备列表中找到,Linux设备列表是Linux操作系统的分配设备编号和/ dev目录节点的正式注册表。

对于大多数设备而言,此前缀后面跟着唯一标识特定设备的编号。 对于硬盘驱动器,使用字母来标识设备,然后使用数字来标识分区。因此,文件系统可以通过/dev/sda3找到磁盘上的区域;把/dev/pts/14与联网的终端会话联系起来。

操作设备文件的相关命令

mknod

大家如果对嵌入式感兴趣,大家可以自行查看该命令的使用方法。

相关推荐:《Linux视频教程》

以上就是什么是linux设备文件的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/260866.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月4日 08:57:49
下一篇 2025年11月4日 08:58:50

相关推荐

  • Golang跨系统开发环境统一配置实践

    使用Go Module统一依赖管理,确保跨平台路径一致;2. 通过gofmt、revive等工具结合Git Hooks强制代码风格统一;3. 利用Docker容器化封装开发环境,实现“一次配置,处处运行”;4. 采用Makefile驱动构建与测试,配合CI/CD验证多系统兼容性。 在团队协作或多人开…

    2025年12月16日
    000
  • Go语言中设置进程名称的实用指南

    本文探讨了在Go语言中修改进程在ps等工具中显示名称的方法。由于Go语言的特性,直接修改os.Args[0]无效,需要借助unsafe和syscall包实现。文章介绍了两种主要方案:通过修改os.Args[0]的底层内存,以及利用Linux特有的PR_SET_NAME系统调用,并详细说明了它们的实现…

    2025年12月16日
    000
  • Golang Linux服务器开发环境部署与调试

    答案:搭建Golang开发环境需安装Go并配置PATH,使用go mod管理依赖,通过CGO_ENABLED=0编译静态文件,用systemd部署服务,配合Delve实现远程调试,确保防火墙开放端口及正确权限设置。 搭建Golang开发环境并部署Linux服务器应用,关键在于配置编译环境、设置运行时…

    2025年12月16日
    000
  • Go项目布局:结构化与最佳实践指南

    Go项目布局没有一成不变的“最佳”标准,而是应根据具体用例灵活调整。本文将探讨Go项目结构演变,从传统的GOPATH工作区到现代实践中广泛采用的cmd目录模式,强调将二进制文件与核心应用逻辑分离,以提升代码可重用性。同时,文章还将提供关于包组织、文件粒度及go get友好型仓库布局的专业建议,帮助开…

    2025年12月16日
    000
  • Go 程序执行时 “permission denied” 错误排查与解决

    在 CentOS 6.3 等 Linux 系统上使用 Go 语言进行开发时,可能会遇到 “fork/exec /tmp/go-build…/a.out: permission denied” 错误。这个错误表明程序在尝试执行编译后的二进制文件时,由于权限问题而被拒…

    2025年12月16日
    000
  • 生成 Go 程序 Core Dump 文件的实用指南

    本文旨在帮助开发者解决 Go 程序崩溃时无法生成 core dump 文件的问题。我们将深入探讨 core dump 的生成机制,分析 Go 语言的特殊性,并提供一系列实用的排查和解决方案,助你有效定位和解决程序崩溃问题。 在 Linux 等 POSIX 系统中,core dump 是操作系统在进程…

    2025年12月16日
    000
  • Golang Docker Compose多容器管理实践

    使用Golang结合Docker Compose可高效管理多容器微服务。首先通过多阶段Dockerfile构建轻量镜像,将编译后的二进制复制到alpine等精简镜像;接着在docker-compose.yml中定义服务拓扑,包括API、PostgreSQL、Redis等服务,配置端口映射、环境变量、…

    2025年12月16日
    000
  • Go项目结构化实践:从基础到最佳策略

    Go项目结构没有一劳永逸的完美方案,其最优布局取决于具体用例。本文将探讨Go语言官方推荐的工作区结构,并深入分析现代Go项目中的实用组织原则,如将二进制文件与应用逻辑分离、推崇库驱动开发,以及如何合理组织包和文件,旨在帮助开发者构建清晰、可维护且易于协作的Go项目。 1. Go工作区的基础组织结构 …

    2025年12月16日
    000
  • 生成 Go 程序 Core Dump 文件的完整指南

    本文旨在帮助开发者解决 Go 程序崩溃时无法生成 core dump 文件的问题。我们将深入探讨 Go 程序的错误处理机制与操作系统 core dump 机制之间的关系,并提供一系列实用的排查和配置步骤,确保在程序崩溃时能够生成 core dump 文件,从而有效地进行问题定位和调试。 理解 Cor…

    2025年12月16日
    000
  • Go 编译执行时出现 “permission denied” 错误的解决方案

    在 CentOS 6.3 等 Linux 系统上使用 Go 语言进行开发时,可能会遇到 “fork/exec: permission denied” 错误。 这个问题通常发生在尝试运行编译后的 Go 程序或直接使用 go run 命令时。 错误信息表明程序在尝试执行位于临时目…

    2025年12月16日
    000
  • Go 编译执行时 “permission denied” 错误解决方案

    在 CentOS 6.3 等 Linux 系统上使用 Go 语言进行开发时,有时会遇到一个令人困惑的错误:fork/exec /tmp/go-build…/a.out: permission denied。 即使以 root 用户身份运行,也可能出现此问题。 这通常不是一个直接的权限问题…

    2025年12月16日
    000
  • 如何使用Golang实现容器资源监控

    答案:Golang实现容器监控可通过读取cgroup文件系统、调用Docker API或暴露Prometheus指标。1. 直接读取/sys/fs/cgroup/下对应容器的cpuacct.usage和memory.usage_in_bytes等文件获取CPU、内存数据;2. 使用Docker官方客…

    2025年12月16日
    000
  • Go 编译执行权限被拒绝问题排查与解决

    在 CentOS 6.3 等 Linux 系统上使用 Go 语言进行开发时,可能会遇到 “fork/exec /tmp/go-build…/a.out: permission denied” 错误。这通常意味着 Go 编译器在尝试编译和执行程序时,由于权限问题无法…

    2025年12月16日
    000
  • 如何中断 io.CopyN 操作

    本文将介绍如何中断正在进行的 io.CopyN 操作。核心思路是通过关闭输入流来触发 io.CopyN 返回错误,从而达到中断复制的目的。文章提供了一个完整的示例代码,演示了如何在指定时间后关闭输入文件,进而中断 io.CopyN 的执行。 在Go语言中,io.CopyN 函数用于从一个 io.Re…

    2025年12月16日
    000
  • Go语言文件命名规范:下划线或点开头的源文件为何被构建工具忽略?

    本文深入探讨Go语言中以_或.开头的源文件在go build过程中被忽略的机制。我们将解析其背后的设计考量,结合官方go/build包的文档说明,并通过具体示例阐述这种命名规则对包导入和函数可访问性的影响,并提供相关注意事项,帮助开发者避免潜在的编译问题。 Go 构建工具的文件忽略规则 在go语言的…

    2025年12月16日
    000
  • Go项目结构化实践指南

    Go项目结构没有一劳永逸的最佳方案,它高度依赖于具体用例。本文将探讨Go项目布局的演变,从官方GOPATH工作区模型到现代应用分离二进制与库的实践,强调cmd目录的使用、多二进制管理,以及包粒度的权衡。目标是提供一套灵活且实用的指导原则,帮助开发者构建清晰、可维护、易于部署的Go项目。 Go项目结构…

    2025年12月16日
    000
  • Go语言中HTML转PDF教程:使用go-wkhtmltopdf实现文档生成

    本教程详细介绍了如何在Go语言中利用go-wkhtmltopdf库将HTML内容高效地转换为PDF文档。文章涵盖了库的安装、基本用法示例代码,并重点强调了处理非信任HTML时的安全注意事项,以及针对特定场景(如动态JS或专业报告)的其他工具建议,旨在提供一个全面且安全的HTML转PDF解决方案。 H…

    2025年12月16日 好文分享
    000
  • Go语言中设置进程名称的实践与探讨

    Go语言中设置进程名称并非直接修改os.Args[0]即可。本文深入探讨了两种主要方法:通过unsafe包修改argv[0]的内存区域,以及利用syscall包调用Linux特有的PR_SET_NAME系统调用。这两种方法各有其严格的限制,如名称长度限制和平台兼容性问题,且均涉及Go语言的底层操作,…

    2025年12月16日
    000
  • Go语言中将HTML转换为PDF的实践指南:基于wkhtmltopdf

    本文详细介绍了如何在Go语言中利用go-wkhtmltopdf库将HTML内容高效转换为PDF文件。教程涵盖了环境搭建、基本代码实现、以及处理HTML字符串和文件输入的方法。此外,还特别强调了使用此工具时必须注意的安全风险、最佳实践和性能优化建议,旨在帮助开发者安全、有效地完成HTML到PDF的转换…

    2025年12月16日 好文分享
    000
  • Go 语言中以 _ 开头的文件行为解析

    本文深入探讨了Go语言中以 _ 或 . 开头的文件在 go build 命令下的特殊处理机制。这些文件通常被Go工具链视为非源码文件而忽略,导致其中定义的函数和类型无法被编译和导入。文章将解析其背后的原理,提供示例说明,并给出在Go项目开发中文件命名和管理方面的最佳实践与注意事项。 Go 文件命名约…

    2025年12月16日
    000

发表回复

登录后才能评论
关注微信