2 个版本
使用旧的 Rust 2015
0.1.1 | 2018年5月25日 |
---|---|
0.1.0 | 2017年3月4日 |
#535 在 操作系统
11KB
128 代码行
这是一个用于在 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();
}
文档
依赖项
~0.6–0.8MB
~12K SLoC