4个版本

0.2.2 2023年7月10日
0.2.1 2021年8月14日
0.2.0 2021年8月14日
0.1.0 2021年8月6日

#353 in Unix APIs

MIT/Apache

10KB
62 代码行数,不包括注释

pidfd_getfd

pidfd_getfd on crates.io Latest documentation on docs.rs License information for pidfd-getfd

此包提供了对pidfd_getfd系统调用的直接绑定,以及一个稍微方便一些的包装器get_file_from_pidfd。它还包含对PidFd和std::os::linux::process::PidFd的扩展trait(目前仅在nightly rustc上可用),通过PidFdExt::get_file()提供对get_file_from_pidfd的访问。

请注意,pidfd目前仅在Linux 5.6或更高版本上受支持,因此此包只能在Linux上运行。如果其他平台获得对pidfd的支持,请通过issue或pull request通知我!

请注意,此包尚未经过彻底测试。请谨慎使用。

示例

use pidfd_getfd::{get_file_from_pidfd, GetFdFlags};
use std::{
    io::{self, Read},
    os::unix::prelude::RawFd,
};

let pidfd: RawFd = /* ... */;
let target_fd: RawFd = /* ... */;
let mut file = get_file_from_pidfd(pidfd, target_fd, GetFdFlags::empty())?;
let mut buf = Vec::new();
file.read_to_end(&mut buf)?;
println!("{:#?}", buf);
Ok(())

使用pidfd

use pidfd::PidFd;
use pidfd_getfd::{GetFdFlags, PidFdExt};
use std::process::Command;

let child = Command::new("/usr/bin/foo").spawn().expect("failed to run `foo`");
let pidfd = PidFd::from_std_checked(&child)?;
let file_from_child = pidfd.get_file(1, GetFdFlags::empty())?;

使用nightly rustc

#![feature(linux_pidfd)]

use pidfd_getfd::{GetFdFlags, PidFdExt};
use std::{
    os::linux::process::{ChildExt, CommandExt},
    process::Command,
};

let child = Command::new("/usr/bin/foo")
    .create_pidfd(true)
    .spawn()
    .expect("failed to run `foo`");

let file_from_child = child.pidfd()?.get_file(1, GetFdFlags::empty())?;

依赖项

~37KB