#子进程 #端口 #任务 #mach #发送 #测试

bin+lib spawn-task-port

在 OS X 上创建子进程并获取子进程的 Mach 任务端口

2 个版本

使用旧的 Rust 2015

0.1.1 2018年5月25日
0.1.0 2017年3月4日

#535操作系统


被用于 akhramov-read-process-mem…

MIT 许可证

11KB
128 代码行

Build Status crates.io

这是一个用于在 OS X 上创建子进程并获取子进程 Mach 任务端口的 crate。许多有用的 OS X 内核 API 需要访问任务端口,而在最近发布的 OS X 中,task_for_pid 的安全性已被加强,即使作为 root 用户也不再可靠。然而,对于您所创建的进程,可以让子进程进行合作并将任务端口发送给父进程。这个 crate 使用 CommandExt::before_exec 和一些 Mach API 实现了这一功能。

这部分代码主要基于 Michael Weber 的 一些关于 Mach 端口的趣事 博文中的信息,其他部分则来自 Chromium 的 mach_port_broker.mm

这个 crate 是为了编写测试 read-process-memory crate 而编写的。您可能需要与这个 crate 一起使用!

示例

extern crate spawn_task_port;

use std::ffi::OsString;
use std::io;
use std::process::Command;
use spawn_task_port::CommandSpawnWithTask;

// Spawn `exe` with `args` as a child process and do interesting
// things to it.
fn do_some_work(exe: OsString, args: Vec<OsString>) -> io::Result<()> {
 let (mut child, task_port) = Command::new(&exe)
        .args(&args)
        .spawn_get_task_port()?;
 // Now you can call mach APIs that require a `mach_port_t` using `task_port`,
 // like `vm_read`.
 child.wait()?;
 Ok(())
}

fn main() {
   use std::env;
   let mut args = env::args_os().skip(1);
   let exe = args.next().unwrap();
   let rest: Vec<_> = args.collect();
   do_some_work(exe, rest).unwrap();
}

文档

https://docs.rs/spawn-task-port

依赖项

~0.6–0.8MB
~12K SLoC