以零长度调用 write() 会产生什么后果?

2024-03-18

在 Linux 中处于相当高的水平write()函数,它会过滤掉写入 0 长度缓冲区的请求。这是有道理的。谁愿意操作系统浪费时间钻探各层只是为了确定没有任何工作要做?

嗯……我。

这与Linux 内核中的 I2C 写入确认轮询 https://stackoverflow.com/questions/1195659/i2c-write-acknowledge-polling-in-linux-kernel;并且发现,如果握手错误,地址(在数据之前在总线上发送)将给出错误,则位绑定的 I2C 驱动程序将给出潜在有用的返回代码。

人们可以在地址之后发送虚拟数据,但不能使用我正在使用的设备。 (也许我会尝试阅读......)。

所以问题是:如果内核允许零 (0) 长度写入,将会引发什么样的地狱?


您所描述的内容本质上与感染多个需要不可预测的内存量的 Windows API 的邪恶行为相同。实践是在没有缓冲区来放置工作的情况下调用它们,无论如何它们都会完成工作,不存储结果,而是计算沿途所需的字节数。然后分配该大小的缓冲区,并在知道大小的情况下再次使用该缓冲区调用该函数。

这是无法形容的邪恶。这是相当于腐朽的官僚机构的计算机编程,每个部门都要求您填写一份表格,其中的信息与您提供给前一个部门的信息大部分相同,但由于每个表格上都有一些不同的信息,他们不会只是拿走你给其他人的表格的副本。噗!

程序员的时间很昂贵,CPU 的时间很便宜。要求程序员编写相同的 API 调用 N 次,以弄清楚 API 本身可以自行解决的某种世界状态,试图颠覆这一现状。

那么,最佳实践是让驱动程序尽一切努力确保 write() 成功。如果可以通过检查世界的某些状态来提前预测它无法成功,那么也许应该是 ioctl()。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

以零长度调用 write() 会产生什么后果? 的相关文章

  • 将数据写入文件:fflush()需要大量时间

    我有一个要求 其中我必须缓冲大量数据 以 GB 为单位 以供将来使用 由于没有足够的 RAM 来缓冲如此大量的数据 我决定将数据存储在文件中 现在的陷阱是 当我将数据写入文件时 其他线程可能需要 缓冲 数据 因此每次向文件流写入内容时 我都
  • 为什么函数 printk() 不使用逗号来分隔参数?

    一个例子printk call printk KERN INFO Log message n 也许这个问题更多地是关于C的 因为我之前从未见过C中的函数可以不用逗号分隔参数 这是如何运作的 编译器如何处理这些信息 由于日志级别是一个整数 而
  • 如何用 C 语言从串行(SPI)连接读取数据?

    我正在尝试编写一个程序 该程序将安装在 Linux MCU Raspberry Pi 上 该程序将读取从另一个 MCU 我将自己构建的自制程序 发送到它的串行数据 我研究了如何做到这一点 并认为我有 大局 但仍然缺少一些东西 其一 我需要启
  • I2C 驱动程序应如何在 ACPI 中与 HID PRP0001 匹配

    我正在尝试实例化这个传感器 https elixir bootlin com linux v5 2 source drivers iio proximity vl53l0x i2c c在 ACPI 中使用设备特定数据 即Name DSD 并
  • 将二进制文件读入结构体

    我正在尝试使用 C 读取二进制数据 我拥有有关我想要读取的文件中的数据布局的所有信息 我能够 逐块 读取数据 即将前 40 个字节的数据转换为字符串 然后获取接下来的 40 个字节 由于数据至少有三个略有不同的版本 我想将数据直接读入结构中
  • 根据用户输入C++打开文件

    我正在尝试制作一个程序 该程序将根据用户输入打开文件 这是我的代码 include
  • 检查lua中是否存在目录?

    如何检查 lua 中是否存在目录 如果可能的话最好不使用 LuaFileSystem 模块 尝试做类似以下 python 行的事情 os path isdir path 这是一种在 Unix 和 Windows 上都适用的方式 无需任何外部
  • 调试严重的 SIGILL 崩溃:文本段损坏

    我们的系统是基于 PowerPC 的运行 Linux 的嵌入式系统 我们遇到了随机的 SIGILL 崩溃 这种情况在各种应用程序中都会出现 崩溃的根本原因是将要执行的指令归零 这表明内存中的文本段已损坏 由于文本段是以只读方式加载的 因此应
  • dmesg 和 /var/log/kern.log 之间的区别

    我正在修改kvm模块 并在内核代码中添加了printk语句 运行虚拟机后 printk为我提供了错误地址和有关客户操作系统的其他信息 我需要根据此信息生成统计信息 当我使用 dmesg 时 我只能看到错误地址 在内核空间中 即它们的地址高于
  • x86 平台中的 KVM 影子页表处理

    据我了解 在没有硬件支持来宾虚拟到主机物理地址转换的处理器上 KVM 使用影子页表 当来宾操作系统修改其页表时 会构建和更新影子页表 硬件中有没有专门的指令 以x86为参考 来修改页表 除非有特殊说明 否则不会对VMM 造成陷阱 Linux
  • 从相对路径读取文件

    我知道这个问题之前已经被问过 1000 次了 我确实尝试了所有解决方案 Java项目中如何从相对路径读取文件 java io File 找不到指定的路径 https stackoverflow com questions 3844307 h
  • Lisp 格式和强制输出

    我不明白为什么这段代码在不同的实现中表现不同 format t asdf setq var read 在 CLISP 中 它的行为与预期一致 先打印提示 然后读取 但在 SBCL 中 它显示 then输出 我在网上查了一下 修改了一下 fo
  • 如何在 Linux 内核空间使用 ioctl()?

    可以打电话吗ioctl来自 Linux 内核模块 谁能提供一个如何使用它的例子吗 您可以尝试拨打电话sys ioctl 如果内核是用以下命令编译的 则它会被导出CONFIG COMPAT 或者 如果您有设备驱动程序struct file o
  • 从 createProcess 外部获取的句柄读取

    我正在尝试创建一个进程 并通过我在外部提供的句柄与其进行通信createProcess功能 stdOutH lt openFile logDir gt stdout log ReadWriteMode hSetBuffering stdOu
  • 关闭/清理“混合”文件描述符/套接字

    当我使用accept 创建一个套接字并使用fdopen 从中创建一个文件时 我需要做什么来清理所有内容 我是否需要对 FILE 执行 fclose 对套接字执行 shutdown 和 close 还是只需要 shutdown 和 或 clo
  • 如何获取uinput创建的设备的名称(路径)

    我已经成功设置了一个小程序来创建uinput questions tagged uinput我计划使用它来自动测试接收键盘输入事件的应用程序 我已关注both http thiemonge org getting started with
  • 是否可以将 CFLAGS 设置为 Linux 内核模块 Makefile?

    例如 常见设备模块的Makefile obj m jc o default MAKE C lib modules shell uname r build M shell pwd modules clean MAKE C lib module
  • java中filewriter的flush和close函数之间的区别

    我需要知道Java中的flush和close函数之间的确切区别是什么 当在写入文件期间将数据转储到文件中时 请提供一个例子 flush just确保所有缓冲数据都写入磁盘 在这种情况下 更一般地说 通过您正在使用的任何 IO 通道刷新 之后
  • 无法访问打开的/arch/x86/syscalls/syscall_32.tbl

    当我在切换到内核后编写此命令时 当我编译它时 它没有显示任何列表 是否有其他命令可以打开列表 open arch x86 syscalls syscall 32 tbl Bug 先删除 文件路径中的字符 应该是relative http e
  • 将 mmap 内核启动参数保留的内存映射到用户空间

    正如中所讨论的this https stackoverflow com q 1911473 143897问题 我在启动时使用内核启动参数保留一个内存块memmap 8G 64G 我写了一个字符驱动程序 http pete akeo ie 2

随机推荐

  • PHP 中 $variable->something 的故事是什么?

    我见过这种方法被广泛使用 尤其是在 SimpleXML 中 Is this row gt unixtime 和这样做一样吗 row unixtime 这叫什么 为什么 如何使用它 使用 PHP 进行面向对象编程 https stackove
  • 使用 REST API 通过 PHP 连接到 VCenter 身份验证错误

    我按照官方 vSphere 站点中的说明从服务器和答案中获取信息这里的另一个用户 https stackoverflow com a 49324757 12013253 据我了解 首先我必须获取会话id cis id 但结果我得到 null
  • Django 模板扩展和 CSS

    我有这样的基本模板 当我刷新页面时 此文本会记录在日志中 01 Dec 2011 18 22 00 GET search HTTP 1 1 200 2760 01 Dec 2011 18 22 00 GET static style css
  • 关闭并打开新窗口后,SSH 密钥在 git bash 上不起作用

    使用以下链接创建 ssh 密钥 https help github com articles generate a new ssh key and adding it to the ssh agent https help github c
  • 逻辑右移、算术右移、循环右移的区别

    我一直在阅读经典的 黑客之乐 但我很难理解逻辑右移 算术右移和右旋转之间的区别 如果疑问看起来太简单 请原谅 首先记住机器字的大小是固定的 说 4 您的输入是 a b c d 然后将所有内容向左推一位即可得到 b c d X 问题 X 应该
  • 在javascript中调用java方法[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我正在尝试在 javascript 中调用 java 方法 java类驻留在服务器端 示例 Java 代码是 public class
  • 按类前缀定位元素

    假设我有以下元素 div class home div class tab231891230 div div class tab121232441 div div class tab123134545 div div 如何使用 jQuery
  • 查找二维 numpy 数组中的共同元素

    如果我有两个 或更多 二维数组 如何在给定行号的情况下仅获取数组之间的公共元素 例如 我有以下格式的数组 time position velocity acceleration 我想让两个数组只具有相同的时间元素 所以第 0 行 我可以使用
  • 使用 wmi win32 类检查可用端口?

    我正在使用 inno setup 来制作安装文件 它需要提取本地 IP 地址 我可以通过查询 Win32 NetworkAdapterConfiguration 来完成 并检查特定端口是否打开以供软件运行 我目前正在寻找答案 我意识到 WM
  • 将我的 ASP.NET MVC 页面另存为 pdf

    如何将 ASP NET MVC 页面保存为 PDF 有第三方库可以为您提供非常好的保真度 我写这个帖子 http blog muhimbi com 2010 08 convert sharepoint html pages to pdf h
  • 程序集 - 无法设置断点 lldb

    我用这些选项组装了nasm O0 g f macho64但 lldb 抱怨 无法将断点解析到任何实际位置 当我尝试在文件中的行号处设置任何断点时 我已经开始尝试学习 OS X 的 64 位汇编 但到目前为止这确实是一个挑战 似乎几乎没有任何
  • Python绘图图像保存错误

    我是Python新手 我已经使用 Django 编写了 Web 服务来将图像保存在服务器中 我正在尝试使用下面的代码将绘图保存为图像 并且它可以正常工作 3 次 之后 Python 会抛出错误 如何解决这个问题 Exception igno
  • 我可以像这样使用 try-catch-finally 吗?

    我在用着try catch多年来 但我从未学会如何以及何时使用finally 因为我从来不明白这一点finally 我读过坏书 我想问你关于使用finally就我而言 我的代码示例应该解释一切 s c MyClassForFileHandl
  • Flyspell 无法在 emacs 中加载 LaTeX 文件

    下列的这个网页 http www sop inria fr members Manuel Serrano flyspell flyspell html 我编辑了 emacs 文件并添加了以下行 add hook LaTeX mode hoo
  • 使用 ::SysFreeString() 释放 BSTR。更多平台依赖性?

    我正在编写一个 COM 服务器 它有很多接口和方法 大多数方法都将 BSTR 作为参数并作为用于返回的本地参数 一个片段看起来像 更新5 真正的代码 它根据数据库的特定条件从一堆数据中获取数据以填充对象数组 STDMETHODIMP CAp
  • PHP - 使用socket_recv时出错

    在此函数内运行 socket recv 时出现套接字错误 function readByteXByteSIBmsg msg buf try while ret socket recv this gt kpSocket buf 8192 0
  • Mercurial 和 NTFS 备用数据流

    Mercurial 如何处理备用数据流 在 NTFS 文件系统中 如果它不能处理这个问题 是否有 DCVS 可以处理 EDIT 当我更改版本时update ADS 会发生什么情况 它丢失 删除 了吗 也有版本吗 是不是都被忽略了 Mercu
  • 为什么 catch 参数是隐式最终参数?

    catch IOException SQLException ex logger log ex throw ex 这是为什么ex隐式最终 让 ex 隐式最终有什么用 它是隐式最终的 因为更改所指向的对象对您来说没有意义ex 特别是在这种情况
  • 计算UIScrollView的minimumZoomScale

    我有一个图像 我想将其加载到图像视图中 并设置minimumZoomScale 以及将zoomScale设置为aspectFill之类的比例 我计算如下 configure the map image scroll view iImageS
  • 以零长度调用 write() 会产生什么后果?

    在 Linux 中处于相当高的水平write 函数 它会过滤掉写入 0 长度缓冲区的请求 这是有道理的 谁愿意操作系统浪费时间钻探各层只是为了确定没有任何工作要做 嗯 我 这与Linux 内核中的 I2C 写入确认轮询 https stac