如何确保每次迭代后释放每个“子”进程的文件句柄?

2023-12-06

我采取了以下计划来自 Rust 文档std::process::Command。经过一些迭代后它停止工作。

use std::process::Command;
use std::process::Stdio;

fn main() {
    loop {
        let mut echo_child = Command::new("echo")
            .arg("oh no a tpyo")
            .stdout(Stdio::piped())
            .spawn()
            .expect("failed to start 'echo'");

        let echo_out = echo_child.stdout.expect("failed to open 'echo' stdout");

        let sed_child = Command::new("sed")
            .arg("s/tpyo/typo/")
            .stdin(Stdio::from(echo_out))
            .stdout(Stdio::piped())
            .spawn()
            .expect("failed to start 'sed'");

        let sed_out = sed_child
            .wait_with_output()
            .expect("failed to wait on 'sed'");
        let sed_out_slice = sed_out.stdout.as_slice();
        assert_eq!(b"oh no a typo\n", sed_out_slice);
        println!("out: {:?}", String::from_utf8_lossy(sed_out_slice));
    }
}

每次崩溃时,我都会收到以下输出:

thread 'main' panicked at 'failed to start 'sed': Error { repr: Os { code: 35, message: "Resource temporarily unavailable" } }', src/libcore/result.rs:906:4

根据的文档Child(我从哪里获取这个程序),它说:

没有实施Drop对于子进程,所以如果你这样做 不能确保Child退出后它将继续运行,即使 之后Child子进程的句柄超出了范围。

如何确保每个文件句柄Child每次迭代后都会发布流程吗?


如果您立即阅读您所引用的段落之后的段落:

Calling wait(或围绕它的其他函数)将使父进程等到子进程实际退出后再继续。

为了打电话wait,你需要不动stdout out of Child:

let echo_out = echo_child.stdout.take().expect("failed to open 'echo' stdout");

// ...

echo_child.wait().expect("Couldn't wait for echo child");

也可以看看:

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

如何确保每次迭代后释放每个“子”进程的文件句柄? 的相关文章

随机推荐

  • 如何从源代码为任何应用程序创建数据流图 (DFG/SDFG)

    我做了很多研究来弄清楚如何从源代码为应用程序创建 DFG DFG 可在线用于某些应用程序 例如 MP3 解码器 JPEG 压缩和 H 263 解码器 我一直无法弄清楚如何从源代码为 HEVC 等应用程序创建 DFG 是否有任何工具可以立即为
  • Datastax DSE 5.1 搜索是否支持 facet.pivot 中使用的 Solr 本地参数

    据我了解 DSE 5 1 运行 Solr 6 0 版本 我正在尝试使用 Solr 本地参数来使用 facet pivot 功能 但它似乎不起作用 我的数据如下简单4个字段 我需要的是按名称字段对结果进行分组 以便获得每年的总和 钱 我相信带
  • Android 上的 OpenGL 深度缓冲区

    我目前正在 Android 2 1 上学习 OpenGL ES 编程 我从强制性的旋转立方体开始 它旋转得很好 但我无法让深度缓冲区工作 多边形始终按照 GL 命令渲染它们的顺序显示 我在 GL 初始化期间执行此操作 gl glClearC
  • 安装Maven 3后mvn无法识别

    我的 Maven 3 安装有一些问题 我已经下载了maven 3 0 3并将其解压到一个文件夹中 我设置了以下环境变量 M2 HOME C a few folders apache maven 3 0 3 M2 M2 HOME bin JA
  • 更改 JtextPane 中的鼠标指针

    我有一个JTextPane其内容类型为文本 纯文本 我为此设置了一些文本JTextPane它包含一些显示的文本URLs 当我将鼠标指向该文本时 我想仅将鼠标指针更改为手形指针 这个功能可以实现吗 注 我有以下内容JTextPane as t
  • 对于 DynamicComponentLoader,@ContentChild 为 null

    我有一个可在许多页面上使用的侧面导航组件 这不是单页网络应用程序 它动态加载到切换菜单的父组件上 ContentChild 用于获取子组件的句柄 以便可以通过设置 input overrideHidden 来切换子组件 问题是 Conten
  • Ruby/Watir:firefox 无头

    根据这个 https developer mozilla org en US Firefox Headless modefirefox 57 能够以无头模式运行 我尝试将它与此一起使用 omg3r Watir Browser new fir
  • 堆栈跟踪是如何生成的?

    程序中没有任何一个方法 知道 它在堆栈上的位置 它所知道的只是它自己的小工作 它完成了它并返回 那么 当抛出异常并打印堆栈跟踪时 这是从哪里来的呢 JVM 中是否隐式有一个单独的线程与每个应用程序一起运行来监视程序的状态 或者 JVM 本身
  • Google表格:删除包含指定数据的行

    我是 Java 脚本和 Google Apps 脚本的新手 所以如果这个问题已经得到解答 我很抱歉 在从事这个项目的最后几个月里 我无法找到我想要的东西 我正在这里编写脚本的变体 如果在单元格中找到特定 单词 则删除 Google 表格中的
  • 在类型转换中,类型“List”不是类型“List”的子类型

    运行后飞镖迁移 应用空安全性 该错误在我的代码中弹出 我认为这是导致代码块的错误 LayoutBuilder builder context cons return GestureDetector child new Stack child
  • 由于谷歌自动服务处理器,无法编译我的 javafx 和 selenium 项目(“无法获取公共无参数构造函数”)

    我正在尝试使用 Maven 编译我的 Instagram 机器人 它使用javafx作为接口 使用selenium作为自动化 我已经被这个错误困扰了很长时间 当我尝试做的时候mvn clean javafx jlink它向我显示了这个错误
  • MYSQL 无法从 PHP 接收数据

    我正在尝试将数据从输入发送到我的 sql 数据库 这是它尝试将信息发送到数据库的编码 它不会出现在数据库中 编码有什么问题
  • 如何将密码从md5转换为laravel加密方法

    我想将现有项目重新开发为 laravel 在我的旧系统中 我将密码存储到 md5 中 现在我如何根据现有用户的 laravel 哈希方法将其转换 有什么直接的方法可以做到吗 有什么直接的方法可以做到吗 不 没有直接的方法 但你可以通过重写来
  • 禁用 CMake 选项没有效果

    我正在准备一个应用程序 它应该在有或没有 GUI 的情况下工作 所以我在 CMakeLists txt 中使用命令 option NEED GUI Include Qt support OFF and if NEED GUI message
  • R 中给定出生日期和任意日期的有效且准确的年龄计算(以年、月或周为单位)

    我面临着计算给定出生日期和任意日期的年龄 以年 月或周为单位 的常见任务 问题是 我经常必须对许多记录 gt 3 亿 执行此操作 因此性能是这里的一个关键问题 在 SO 和 Google 中快速搜索后 我找到了 3 个替代方案 常见的算术过
  • Python 中 (1,) 是什么意思?

    我查看了类似的问题 但没有在任何地方找到这个主题 我想知道元组有什么作用 1 在 Python 中是什么意思 From https wiki python org moin TupleSyntax 单元素元组 单元素元组如下所示 1 这里的
  • 索尼,相机远程API

    我有一台 Sony Alpha 5000 ILCE 5000 相机 我一直在用它开发一个网络项目 我通过 wifi 使用 JSON 集成该相机没有任何问题 但我不想依赖 wifi 相机 我的Web项目是否可以像远程相机控制程序一样通过USB
  • 如何防止 vim autocmd 在命令行窗口中运行?

    当我离开插入模式时 我使用自动命令关闭预览窗口 如中所述这个答案 但是当我在命令行窗口中时 q 我得到一个错误 E11 Invalid in the command line window
  • 如何使用单个查询 (SELECT) 从两个表中填充两个对象?

    这应该是程序员经常遇到的事情 但我从来没有尝试过这样处理 也就是说 我会解释一下 比如说 我需要从表 Zoo 中获取值 如下所示 SELECT z predator z prey FROM Zoo AS z WHERE z preyType
  • 如何确保每次迭代后释放每个“子”进程的文件句柄?

    我采取了以下计划来自 Rust 文档std process Command 经过一些迭代后它停止工作 use std process Command use std process Stdio fn main loop let mut ec