Linux内核将写入管道的数据保存在哪里

2024-04-09

假设有以下简单代码:

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>

main()
{
    int fd[2];                
    pipe(fd);
 // ...               
    write(fd, buf, VERY_BIG_NUMBER);
 // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
}

现在我的问题是:

  1. 有人可以解释写入将把数据放在哪里吗?
  2. 它是否写入位于用户空间或内核空间的某个缓冲区?
  3. 可以写入管道的最大长度是多少?
  4. 既然管道写入是阻塞操作,那么内核为了效率不就什么也不做,等待读取器然后直接将数据传递给它吗?

有一个管道缓冲区,在 Linux 上通常为 64KB。写入管道缓冲区。一旦满了write()系统调用会阻塞,直到管道的另一端耗尽缓冲区。

摘自管道(7) 手册页 http://linux.die.net/man/7/pipe:

管道的容量是有限的。如果管道已满,则 write(2) 将阻塞或失败,具体取决于管道是否已满O_NONBLOCK标志已设置(见下文)。不同的实现对管道容量有不同的限制。应用程序不应依赖于特定的容量:应用程序的设计应使读取过程在数据可用时立即使用数据,以便写入过程不会保持阻塞状态。

在 2.6.11 之前的 Linux 版本中,管道的容量与系统页面大小相同(例如,i386 上为 4096 字节)。从Linux 2.6.11开始,管道容量为65536字节。

缓冲区位于内核空间中。管道是通过虚拟 pipelinefs 文件系统实现的。该文件系统的内核代码为每个文件分配 16 个 4KB 页面pipe2()系统调用,并且该缓冲区空间与为管道创建的索引节点相关联。read() and write()系统调用将数据复制到用户空间或从用户空间复制数据。 (Source http://www.slideshare.net/divyekapoor/linux-kernel-implementation-of-pipes-and-fifos)

如果写入管道的大小小于 4KB,则它们是原子的。超过 4KB 的写入可能会导致页面错误,因此不再是原子的。这意味着,如果写入大于 4KB,则来自不同进程的多个写入可能会交错。

也可以看看: 管道缓冲区有多大? https://unix.stackexchange.com/questions/11946/how-big-is-the-pipe-buffer

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

Linux内核将写入管道的数据保存在哪里 的相关文章

  • 无法在 Linux 中阻止从命名管道 (FIFO) 读取

    很奇怪 我似乎无法完成这项工作 这是我的架构 我有一个命名管道 它将在永远运行 root读取器进程和多个应用程序编写器进程 读者进程必须是blocking当作家们在nonblocking 因此 这就是我在阅读器进程中所做的 该进程将运行ro
  • 如何将目录路径转换为唯一的数字标识符 (Linux/C++)?

    我正在研究获取目录 文件夹 并派生某种形式的唯一数字标识符的方法 我研究了 字符串到哈希 方法 但是 鸽子洞原理 http www codinghorror com blog 2007 12 hashtables pigeonholes a
  • IDLE 无法导入 Tkinter。您的 Python 可能未配置 Tk [重复]

    这个问题在这里已经有答案了 我运行的是 Ubuntu 10 10 今天安装了 Python 3 2 系统已经运行Python 2 6 我在终端中输入idle3 2 它给了我 IDLE 无法导入 Tkinter 您的 Python 可能未针对
  • 访问单个结构体成员是否会将整个结构体拉入缓存?

    我一直在读乌尔里希 德雷珀的书 每个程序员都应该了解的内存知识 http lwn net Articles 250967 并在部分3 3 2 缓存效果的测量 http lwn net Articles 252125 页面中间 它给我的印象是
  • Yocto for Nvidia Jetson 由于 GCC 7 而失败 - 无法计算目标文件的后缀

    我正在尝试将 Yocto 与 meta tegra 一起使用 https github com madisongh meta tegra https github com madisongh meta tegra 为 Nvidia Jets
  • Python 在打开套接字时可以选择哪个网络适配器吗?

    运行 python 应用程序的目标计算机将具有三个可用的网络接口 一般来说 所有三个网络都会有很大不同 但是三个网络中的两个可能位于相似的网络上 在下面的示例中 我无法控制 ETH 2 上的目标地址 因为它是预先配置的系统 因此我被迫以编程
  • Ansible 权限问题

    我正在尝试将当前用户添加到系统中的某个组 然后执行需要该组权限的命令 我的剧本是这样的 name Add this user to RVM group sudo true user state present name vagrant ap
  • 如何保护Linux中的堆内存?

    我想将一块堆内存设置为只读 为此我尝试过memalign with mprotect 但是从 memalignment 中我能得到什么 memalign 从进程堆中分配内存 我想将堆的某些部分设为只读 有什么帮助吗 malloc gt mm
  • Ubuntu 18.04:laravel/framework v6.9.0 需要 ext-mbstring * -> 您的系统中缺少请求的 PHP 扩展 mbstring

    在有人将其记下来进行复制之前 我检查了其他页面 但它们没有帮助 我正在尝试在 PHP 7 2 上安装 Laravel 6 的软件包 我也尝试过 PHP 7 4 不幸的是 我收到以下错误 laravel framework v6 9 0 re
  • Bash 脚本 Mysql 警告:在命令行界面上使用密码可能不安全

    你好 我有一个脚本来对一些 mysql 数据库进行分区 我们正在从 5 5 升级到 5 6 在测试脚本时 我注意到新的 5 6 版本 mysql 返回Warning Using a password on the command line
  • 如何在Linux中为特定程序设置进程ID

    我想知道是否有某种方法可以在运行某些应用程序之前强制使用 Linux 的某些特定进程 ID 我需要提前知道进程ID 实际上 有一种方法可以做到这一点 自内核 3 3 设置了 CONFIG CHECKPOINT RESTORE 在大多数发行版
  • Linux 上的 Chrome - 查询浏览器以查看打开了哪些选项卡?

    我在 Ubuntu Linux 上运行 Chromium 开源 chrome 版本 我可以编写一个程序来查看我打开了哪些选项卡吗 我想编写一个程序来监控我在事情上花费了多少时间 是否有命令行程序 某种调用 chromium browser
  • 从 Linux 内核模块的文件描述符获取文件名/路径?

    在Linux内核模块中 有没有一种方法可以从文件名 路径中获取文件名 路径 unsigned int fd 我知道这个答案 如何从内核模块内的文件描述符获取文件名 https stackoverflow com questions 8250
  • 获取后台进程的退出代码

    我有一个从我的主 bourne shell 脚本中调用的命令 CMD 该命令需要很长时间 我想修改脚本如下 作为后台进程并行运行命令 CMD CMD 在主脚本中 有一个循环每隔几秒监视生成的命令 该循环还向标准输出回显一些消息 指示脚本的进
  • Bash:更新文件中的变量

    我知道这是一个简单的答案 在找到答案之前我可能可以继续在谷歌上进行挖掘 但我的日程很紧 我希望能得到一个轻松的答复 我需要在安装时更新 ifcfg eth0 中的变量 换句话说 这就是需要发生的事情 以下变量需要更改 ONBOOT no B
  • 使用 cmake 和 opencv 对符号“gzclose”的未定义引用[关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我尝试构建该项目 doppia https bitbucket org rodrigob doppia 但发生链接错误 我想这是一
  • Bash 变量:区分大小写?

    Bash shell 脚本区分大小写吗 是可变的date与DATE 是的 它区分大小写 就像 UNIX 的其余部分一样 date and DATE是两个不同的变量 makefile and Makefile是两个不同的文件 h and H是
  • 为多线程 UDP 客户端执行“close ()”时套接字描述符未释放

    我在下面编写了 UDP 客户端 它基本上生成一个单独的线程来接收数据报 但是数据报仅在主线程中发送 现在 在 Linux 发行版上实例化 udpClient 1 UDP 客户端后按 ctrl D 实现退出循环 围绕 getline 调用 并
  • 在 LINUX 上测量 TLB 未命中的命令

    有人可以指导我使用一个命令来测量 LINUX 上的 TLB 未命中吗 是否可以将轻微页面错误视为 TLB 未命中 您可以使用perf去做这个 前提是你的CPU支持 Use perf list了解可用的计数器 当我拿到这个列表并查找 TLB
  • 更改子进程中的 iostream

    现在 我正在开发一个项目 其中我需要启动一个子进程来使用 C 在 Linux 中执行一个新程序 并且我需要重定向标准输入和输出 就像在 C 中一样 它们是cin and cout 到一个文件 这意味着在子进程中 标准输入和输出都是文件 子进

随机推荐

  • Firebase JWT:签名验证失败

    我尝试在 Firebase 中使用 JWT 身份验证 但总是收到此错误 致命错误 未捕获的 Firebase JWT SignatureInvalidException 签名验证失败 代码是这样的 key test tokenId base
  • spring-data-elasticsearch 在多个索引上搜索

    我的页面上有一个搜索字段 该搜索字段应该搜索多个索引 我可以毫无问题地搜索一个索引 如 spring data elasticsearch 文档中所述 但是 如果我搜索 例如 Foo 我希望得到以下列表作为按相关性排序的结果 title F
  • 滚动条通过 CSS 动画/过渡出现

    我正在用 Angular 来动画我的 ng view三次贝塞尔曲线过渡 Animations slide animation ng enter slide animation ng leave webkit transition all c
  • 双指针与引用指针传递[重复]

    这个问题在这里已经有答案了 在理解双指针概念以及应该在哪里使用它的同时 我有一个疑问 我试验了这段代码 发现我也可以使用按引用传递指针而不是双指针 include
  • MySQL:使用 PREPARE 命令命名参数?

    MySQL 中是否可以使用PREPARE命令与命名参数例如PDO in PHP 这是我的例子 SET s SELECT FROM MY TABLE WHERE my column 1 AND my column 2 PREPARE stmt
  • 如何删除 Google Play 排行榜高分

    我刚刚发布了我的游戏 我看到测试的高分仍然作为高分出现 如何删除它 重置排行榜 在游戏中加载排行榜或成就 在右上角单击设置 共享 断开连接 带有复选框 同时删除谷歌中的所有活动 它将删除您的所有分数
  • 如何通过 PHP 调用 CITRIX (LogMeIn) API 来注册新的 GotoWebinar 与会者?

    我使用以下代码将用户注册到网络研讨会 headers array HTTP 1 1 Accept application json Accept application vnd citrix g2wapi v1 1 json Content
  • 为什么这个onload函数没有运行?

    为什么onLoad没有被触发 function FULL IMAGE fimage document getElementById FULL SRC onLoad function offsetTop document getElement
  • 获取几何长度

    有谁知道获取 WPF 几何图形长度 以像素为单位 的有效方法 我知道 WPF 中的几何图形是基于矢量的 因此实际上没有像素长度 但必须能够根据可见的绘制图像获得长度 我的意思是 如果我在 1024x800 像素图像中绘制一些几何图形 则必须
  • 从表中选择随机单词

    假设我有以下基本 MySQL 数据 CREATE TABLE my words my word VARCHAR 255 INSERT INTO my words VALUES dog INSERT INTO my words VALUES
  • System.IO 找不到通过 subst-command 生成的路径

    context 系统有一个硬盘和一个驱动器 C 所需路径位于 F eventlogging 我做了什么 我执行了 subst cmd 以生成 F 驱动器 来自 C 添加了目录 eventlogging 问题 在代码中 有一些部分写入 F e
  • .NET 4.0 框架与 .NET 1.1 位于同一服务器上

    这些框架版本可以在同一台服务器上正常运行吗 这意味着 IIS 可以支持两个应用程序池 其中一个池配置为 NET 4 0 另一个池配置为 NET 1 1 编辑 这个问题与 IIS 7 有关 是的 您可以在同一个 IIS 实例中运行 1 1 2
  • 在 WKInterfaceLabel 内滚动长文本?

    简单的问题 有没有办法制作WKInterfaceLabel如果文本太长而无法适应标签框架 则滚动 类似于UITextView 你绝对可以做到这一点 您需要做的就是设置以下属性WKInterfaceLabel在故事板中 标签 gt 线 0 W
  • Fortran 读取混合字符串和数字数据

    我在读取语句时遇到问题 我更喜欢 Fortran90 尽管如果有帮助的话其他版本也是可能的 我的文件中有一堆数据行 可以描述为 以空格分隔 没有固定的格式 包含一个字符串 后跟 7 个数字 字符串包含正斜杠 这是一个例子 maxele OS
  • 如何防止(卸载)TypeScript 安装并引用它自己的 @types 到 AppData\Local 中

    我遇到了一个有点令人困惑的问题 似乎TypeScript正在安装自己的副本React进入它自己的全局缓存 不确定它叫什么 假设那就是它是什么 并在我的项目中引用它 具体来说 我最终得到了两个对 React 的引用 其中一个位于我的项目的根目
  • 在maven 2中的命令行上设置插件的属性

    在 maven 2 x 中 如何在命令行上而不是在 pom 或 settings xml 中该插件的 中设置插件的属性 例如 如果我正在使用mvn dependency copy dependencies 在这里看到 http maven
  • 循环系统发育树上的节点标签

    我正在尝试创建循环系统发育树 我有这部分代码 fit lt hclust dist Data 4 method complete members NULL nclus 3 color c red blue green color list
  • Asp.net core 中的条件依赖解析

    我有 2 个控制器 PayerController 和 BusinessController 两个 Controller 构造函数都将 EntityManager 作为参数 它是一个抽象类 我想根据我正在使用的控制器来解析每个管理器类 对于
  • 使用 javascript 将 png 上传到 imgur

    我正在尝试使用Javascript上传一个png to imgur http imgur com 我直接使用了 Imgur API 中的代码example http api imgur com examples 但我认为我没有正确传递 pn
  • Linux内核将写入管道的数据保存在哪里

    假设有以下简单代码 include