Из этого ответа я узнал, что дескриптор файла можно прочитать с помощью unsafe
:
use std::{
fs::File,
io::{self, Read},
os::unix::io::FromRawFd,
};
fn main() -> io::Result<()> {
let mut f = unsafe { File::from_raw_fd(3) };
let mut input = String::new();
f.read_to_string(&mut input)?;
println!("I read: {}", input);
Ok(())
}
$ cat /tmp/output
Hello, world!
$ target/debug/example 3< /tmp/output
I read: Hello, world!
Как мне достичь того же результата, не используя unsafe
?
В настоящее время я создаю дескриптор файла, подобный этому (zsh
shell):
function test_fd {
if ! read -r line <&$1; then
line="[Read on fd $1 failed]"
fi
echo $line
# Remove the handler and close the fd
zle -F $1
exec {1}<&-
}
exec {FD}< <(/path/to/my/app)
zle -F $FD test_fd
Я хотел бы заменить test_fd
чем-то, что могло бы read
или лучше, если бы оно могло read & close
предоставленным дескриптором файла, чтобы я мог закончить чем-то вроде:
function test_fd {
/something/in/rust "$@"
}
exec {FD}< <(/path/to/my/app)
zle -F $FD test_fd