【问题标题】:How can I promote a thread to child process in Rust?如何在 Rust 中将线程提升为子进程?
【发布时间】:2018-07-05 18:59:00
【问题描述】:

我需要写一些类似于compiletest的东西。 Compiletest 通过调用rustc 进程并捕获stdout/stderr 来工作。我的项目还没有要运行的二进制文件,所以我需要另一种方法来创建子进程。

我不能使用通道或标准输出,因为它不受我的代码控制。

【问题讨论】:

  • 有可能吗?没听说过
  • @Boiethios 我期待某些脚本语言中的子进程 api 之类的东西。

标签: process rust stderr


【解决方案1】:

如何将线程提升为子进程

你不能。这只是操作系统不的事情;它不是 Rust 特有的。您不能启动任意线程,然后稍后将其移动(“提升”)到另一个进程;线程和进程是非常不同的概念。

我的项目还没有要运行的二进制文件

我建议做一个。


如果您想简单地启动另一个进程,您可以使用std::process::Command。这将是最推荐的选项。

POSIX 确实有 fork 调用,它复制了进程的整个内存和当前线程,所以理论上你可以用它来“提升”当前线程到一个新进程。

Using this in a multithreaded context can be very complicated 并且默认情况下基本上总是被推荐反对。

Support for fork on Windows is... limited, at best。如果你只关心 POSIX 系统,你可以使用fork from the libc crate

另见:


捕获标准输出/标准错误

隐藏的、不稳定的方法用于更改当前线程stdout/stderr。 Rust 的测试框架使用这些方法。如果您有兴趣使这些稳定,您也许可以offer to help on the tracking issue

【讨论】:

  • 那么..节点子进程是如何工作的?它是否只是生成具有不同参数的 node 可执行文件的其他实例?
  • 哦..有道理..我想这就是为什么只有脚本语言才有这样的多进程 api。
  • 我只想捕获测试的标准错误,并将其与预期输出进行比较。我不在乎它是否在单独的进程中运行,但 stderr 是每个进程的,所以我认为我必须以某种方式为每个测试创建一个进程。
  • fork 将当前线程的副本“提升”到新进程。这怎么不符合这个问题? (虽然我不建议在多线程上下文中使用fork。)
  • @Stefan 你说得很好,我只是不认为fork 与 OP 的实际情况有关,因为听起来他们想将 another 线程移动到进程(加上它是平台相关的)。为了完整起见,我不妨添加它。
猜你喜欢
  • 1970-01-01
  • 2015-07-20
  • 2013-06-07
  • 2011-12-21
  • 1970-01-01
  • 1970-01-01
  • 2011-03-21
  • 1970-01-01
相关资源
最近更新 更多