gpt4 book ai didi

shell - 在 Rust 中简单的用户编写的 shell 中关闭 std::os::Pipe

转载 作者:行者123 更新时间:2023-11-29 08:21:42 27 4
gpt4 key购买 nike

我正在尝试使用 Rust 编写一个 shell。目前,我正在实现管道 |功能。所以我将用户输入拆分为 |成一个程序向量。对于程序,如果不是向量中的最后一个程序,我会生成一个进程。如果是最后一个,我会创建流程并等待它完成。设置管道:

let mut channels: ~[std::os::Pipe] = ~[];
for _ in range(0, progs.len()) {
channels.push(std::os::pipe());
}

设置输入输出FILENO

for i in range(0, progs.len()) {
let mut in_chan = libc::STDIN_FILENO;
let mut out_chan = libc::STDOUT_FILENO;
if i == 0 {
out_chan = channels[i].out;
}
if i > 0 {
in_chan = channels[i-1].input;
out_chan = channels[i].out;
}
if i == progs.len() - 1 {
out_chan = libc::STDOUT_FILENO;
}
}

生成进程:

for i in range(0, progs.len()) {
if i == progs.len() - 1 {
let proc_run = run::Process::new(program, argv, run::ProcessOptions {
env: None,
dir: None,
in_fd: Some(in_chan),
out_fd: Some(out_chan),
err_fd: Some(libc::STDERR_FILENO)
});
proc_run.unwrap().finish();
}
else {
do spawn {
let proc_run = run::Process::new(program, argv, run::ProcessOptions {
env: None,
dir: None,
in_fd: Some(in_chan),
out_fd: Some(out_chan),
err_fd: Some(libc::STDERR_FILENO)
});
proc_run.unwrap().finish();
}
}
}

我试着用一个简单的 C++ 程序来运行它:

#include <iostream>

using namespace std;

int main() {
int readNo;
while(cin >> readNo) {
cout << readNo+1 << endl;
}
return 0;
}

我用 ./a.out | ./a.out 跑了在我看来,管道正在工作(1 => 3、2 => 4 等)但是当我关闭 stdin 时与 ctrl + d .只有第一个进程(首先产生的进程)完成。其余的仍在运行。这里出了什么问题,我该如何告诉其余进程终止?

编辑:

我可以通过向量中所有程序的阻塞进程来做到这一点:

for i in range(0, progs.len()) {
let proc_run = run::Process::new(program, argv, run::ProcessOptions {
env: None,
dir: None,
in_fd: Some(in_chan),
out_fd: Some(out_chan),
err_fd: Some(libc::STDERR_FILENO)
});
proc_run.unwrap().finish();
}

但这不是“shell”所做的,它应该在进程之间是非阻塞的。当我在 stdin 中输入 1 时,它应该立即吐出 3。

感谢任何部分的帮助!

最佳答案

您是否尝试过在每个进程结束时关闭标准输出描述符?

例如

extern crate libc;

...

proc_run.unwrap().finish();
libc::unistd::close(out_chan)

管道属于 Rust Shell 程序,而不是退出的进程,因此当它退出时,管道保持打开状态。自己关闭它,应该在以下过程中关闭标准输入。

关于shell - 在 Rust 中简单的用户编写的 shell 中关闭 std::os::Pipe,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21639832/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com