如何使子进程的标准输入继承并通过管道传输?

问题描述 投票:0回答:1

我想创建一个子进程,它将从父标准输入获取正常输入。但同时我想通过它的标准输入发送信号(ctrl+c -

0x03
就像 xterm 那样)。 使用标准
Command
api 只能继承或管道,而不能两者兼而有之。

我尝试终止该进程,但这不是所需的行为,我希望子进程获得

SIGINT
信号并决定如何处理它。 我还尝试生成一个线程来捕获标准输入,然后通过通道发送数据,然后将其写入管道标准输入,但它开始捕获控制台中的一行,而我不想要它。

我在 Windows 上尝试了所有这些,但我想要一个跨平台解决方案。

我将不胜感激任何帮助:)

rust process stdin child-process sigint
1个回答
0
投票

ctrl+c - 0x03 就像 xterm 所做的那样 [...] 我想要一个跨平台解决方案。

至少在 unice 上,这绝对不是通过 stdin 发送的,它由 shell 解释并转换为信号(在 unice 上为

SIGINT
,在 windows 上为 ConsoleCtrlEvent)。虽然我猜你总是可以通过终止来让你的程序对 ETX 做出反应。但请注意,流中的 ETX 实际上并不意味着程序终止。

Rust 的 stdlib 暴露的信号支持极其有限,基本上只是 SIGKILL。您可能需要使用低级别的特定于平台的板条箱来处理更复杂的事情,请参阅各种链接和评论如何向“子进程”发送信号?

除此之外,如果你想通过 stdin 进行复用,你可能需要手动创建一个管道(我再次认为没有标准库 API),从输出端创建

Stdio
,以及 dup()
 输入,以便您可以将一个传递到数据源,并保留另一个以写入。

© www.soinside.com 2019 - 2024. All rights reserved.