读取和写入长时间运行的 std::process::Child

2024-02-25

我有一个长时间运行的子进程,我需要读取和写入大量数据。我有一个读取器线程和一个写入器线程来操纵child.stdout and child.stdin分别:

extern crate scoped_threadpool;

fn main() {
    // run the subprocess
    let mut child = std::process::Command::new("cat")
        .stdin(std::process::Stdio::piped())
        .stdout(std::process::Stdio::piped())
        .spawn()
        .unwrap();

    let child_stdout = child.stdout.as_mut().unwrap();
    let child_stdin = std::sync::Mutex::new(child.stdin.as_mut().unwrap());

    let mut pool = scoped_threadpool::Pool::new(2);
    pool.scoped(|scope| {
        // read all output from the subprocess
        scope.execute(move || {
            use std::io::BufRead;
            let reader = std::io::BufReader::new(child_stdout);
            for line in reader.lines() {
                println!("{}", line.unwrap());
            }
        });

        // write to the subprocess
        scope.execute(move || {
            for a in 0..1000 {
                use std::io::Write;
                writeln!(&mut child_stdin.lock().unwrap(), "{}", a).unwrap();
            } // close child_stdin???
        });
    });
}

当作者完成后,我想关闭child_stdin以便子进程完成并退出,以便读者看到 EOF 和pool.scoped返回。如果没有的话我就无法做到这一点child.wait()我无法打电话child.wait()因为它被两个线程借用。

我怎样才能完成这个程序?


有趣的是,您自己通过使用共享所有权造成了这种情况Mutex^_^。而不是参考child.stdin,获得它的完全所有权并将其传递给线程。当线程结束时,它将被删除,并隐式关闭它:

let mut child_stdin = child.stdin.unwrap();

// ...

scope.execute(move ||
    for a in 0..1000 {
        use std::io::Write;
        writeln!(&mut child_stdin, "{}", a).unwrap();
    }
    // child_stdin has been moved into this closure and is now
    // dropped, closing it.
);

如果您仍想拨打电话wait得到ExitStatus,将参考更改为stdout以及所有权的转让stdin to use Option::take。这意味着child根本没有借用:

let mut child = // ...

let child_stdout = child.stdout.as_mut().unwrap();
let mut child_stdin = child.stdin.take().unwrap();

// ...

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

读取和写入长时间运行的 std::process::Child 的相关文章

随机推荐

  • 确定无冲突集?

    假设您有一堆集合 而每个集合都有几个子集 Set1 香蕉 菠萝 橙子 苹果 羽衣甘蓝 黄瓜 洋葱 大蒜 Set2 香蕉 黄瓜 大蒜 鳄梨 番茄 设置N 现在的目标是从每个集合中选择一个子集 而每个子集必须与任何其他选定的子集不发生冲突 对于
  • Coffeescript、Backbone 和加载顺序

    考虑这个 Coffeescript 类 在一个应用程序中 每个类都位于自己的文件中 class Manager extends Person title titles manager 如果该文件在 title 对象之前加载 则会生成错误 我
  • JavaScript 对象作为函数参数

    使用 JavaScript 假设我有一个函数 X 并且在该函数中创建了一个名为 objectX 的对象 函数 X 返回对象 X 稍后在代码中 函数 Z somevar anObject 接收 objectX 作为其参数之一 现在在函数 Z
  • 索引键列 VS 索引包含列

    谁能解释一下这两个 索引Key列 VS 索引Included Column 目前 我的索引有 4 个索引键列和 0 个包含列 我想知道两者之间的区别 索引键列是索引 B 树的一部分 包含的列不是 取两个索引 CREATE INDEX ind
  • Codesandbox.io 中的 React-Testing-Library 问题

    我对 React 来说是一个相对菜鸟 想在这个沙盒中练习一些 tdd基本反应沙箱 https codesandbox io s 93yp98knx4 测试代码似乎正在影响应用程序组件状态 如果您在浏览器和测试之间切换 您将看到测试项目被添加
  • SQL Select 包括数据类型和数据值

    如何从表中选择数据并将数据类型包含在值中 例如 我有一个名为 EMPLOYEE 的表 其中包含 fname lastname phone 等 如果我做 SELECT FROM EMPLOYEE 我得到了所有的列 如果我做 SELECT CO
  • 如何定位 UIView?

    我花了几个小时尝试定位 UIView 最终发现我需要修改视图框架 所以我向 UIViewController 子类添加了一个 setPosition 方法 如下所示 void setPosition CGPoint position CGR
  • 将 YYYYMMDD 字符串日期转换为日期时间值[重复]

    这个问题在这里已经有答案了 可能的重复 在 C 中将字符串转换为日期时间 https stackoverflow com questions 1592653 convert string to datetime in c sharp 一个问
  • UIViewController PresentViewController 在 ios 8 上崩溃

    刚刚在我们的错误记录系统中收到此错误 一直在高低搜索 似乎找不到任何解决方案 任何帮助表示赞赏 这里是堆栈跟踪 https gist github com hermanccw 2a9264fd77d46e0e7279 可能在您的 XCODE
  • RESTful 破坏 Rails 中的多态关联?

    如何销毁关联本身并保留关联的对象 同时保持 RESTful 具体来说 我有这些模型 class Event lt ActiveRecord Base has many model surveys as gt surveyable depen
  • 对于表单中的每个控件,如何对表单中的所有文本框执行某些操作?

    如何使用 Foreach 语句对我的文本框执行某些操作 foreach Control X in this Controls Check if the controls is a TextBox if it is delete it s T
  • 命名空间 system.windows 中不存在“Forms”

    我刚刚开始研究 c 并且正在摆弄从某个论坛获得的一些代码示例 此代码使用命名空间using system windows forms我收到错误 命名空间 system windows 中不存在 Forms 我还收到一些与未定义函数相关的错误
  • 如何使用 Azure 移动服务 API 功能

    An APIWAMS 中添加了功能 我可以在其中定义自定义脚本 这似乎反对以前创建脚本表的做法 但是 我找不到任何有关如何使用它的描述 哪些客户端可以使用此功能 可以在 iOS 或 Javascript 中使用吗 还有关于这个主题的更多帖子
  • 我可以让 valgrind 告诉我哪个值未初始化吗?

    I ran valgrind一些代码如下 valgrind tool memcheck leak check full track origins yes test 它返回以下错误 24860 Conditional jump or mov
  • 删除 Safari/Chrome 文本输入/文本区域发光

    我想知道当我使用 CSS 单击文本输入 文本区域时是否可以删除默认的蓝色和黄色发光 编辑 11 年后 不要这样做 除非您要提供后备来指示哪个元素处于活动状态 否则 这会损害可访问性 因为它本质上删除了显示文档中哪个元素具有焦点的指示 想象一
  • mysql json vs mongo - 存储空间

    我遇到了一个有趣的情况 虽然不是一个实际的问题 但我不明白为什么会发生这种情况 我们有一个 mongo 数据库 主要由存储在数组中的一些批量数据组成 由于团队中超过 90 的人熟悉 mysql 而只有少数人熟悉 mongo 再加上这不是关键
  • 钻石继承 (C++)

    我知道拥有钻石继承被认为是不好的做法 然而 我有两个案例 我觉得钻石继承非常适合 我想问 在这些情况下你会建议我使用钻石继承 还是有其他设计可以更好 Case 1 我想创建代表系统中不同类型 操作 的类 这些动作按几个参数分类 该操作可以是
  • StackExchange.Redis - LockTake / LockRelease 用法

    我将 Redis 与 StackExchange Redis 一起使用 我有多个线程 它们会在某个时刻访问和编辑同一键的值 因此我需要同步数据的操作 查看可用的函数 我发现有两个函数 TakeLock 和 ReleaseLock 但是 这些
  • Apache mod 重写简单重定向

    我希望对我的网站的请求按如下方式工作 http example com http example com 理想情况下会拉出index php文件 当前默认行为 而不显示index php http example com foo php h
  • 读取和写入长时间运行的 std::process::Child

    我有一个长时间运行的子进程 我需要读取和写入大量数据 我有一个读取器线程和一个写入器线程来操纵child stdout and child stdin分别 extern crate scoped threadpool fn main run