访问子进程的非标准文件描述符



我有一个子进程,它在非标准文件描述符上具有输入/输出(管道((不在 fd0/stdin、fd1/stdout、fd2/stderr 上(。

如何访问它们?我在文档中没有看到任何允许这样做的地方,或者我可能错过了一些东西:https://doc.rust-lang.org/std/process/struct.Stdio.html

它需要适用于Windows和Mac。

您可以使用标准库中特定于Unix的API来执行此操作,特别是FromRawFd特征:

use std::fs::File;
use std::io::Read;
use std::os::unix::io::{FromRawFd, RawFd};
let fd: RawFd = 3; // example non-standard file descriptor
let mut file = unsafe { File::from_raw_fd(fd) };
// ...

请注意,from_raw_fd是这样说的:

此函数也是不安全的,因为当前返回的原语具有约定,即它们是它们正在包装的文件描述符的唯一所有者。使用此函数可能会意外地允许违反此协定,这可能会导致依赖于它为 true 的代码中的内存不安全。

因此,您需要确保返回的File具有文件描述符的唯一所有权(这就是该函数被标记为不安全的原因(。

最新更新