Rustでプロセスの実行ファイルパスを取得するナニカを作った
Process Entry、略して pentry と名付けました。
github.com
大元の動機は結構前にGoでツール作ってた時、「あー、親プロセスの実行ファイルとれねーかなー」とか思ったたら既にあったというもの*1。
github.com
で、これと同じことをRustできないかなー、って思ったのが始まり。
つーてLinux側は特に心配してなかったんだけど、Windows側はFFIの関係でちょっと苦労した*2。
使い方
基本はプロセスIDから探すので、こうなります。ところでホントにlibc使わないと今のプロセスID取れないんですか…?
extern crate libc; extern crate pentry; let pid: i32; unsafe { pid = libc::getpid() as i32; } if let Ok(ps) = pentry::find(pid) { println!("#{} {}", ps.pid(), ps.path().unwrap()); }
で、いちいちlibc書くのめんどいだろうからヘルパー的に現在プロセスを取得する関数はあります。
extern crate pentry; if let Ok(ps) = pentry::current() { println!("{:?}", ps); }
取得できたプロセスオブジェクトには親プロセスを取得するためのメソッド parent() が生えているので、それをたどれば親プロセスを取得できます( ´∀`)b
extern crate pentry; let ps = pentry::current().unwrap(); let pps = ps.parent().unwrap(); println!("Parent: {:?}", pps);
おまけ:pentryコマンド
cargo install pentryとかすると一緒に pentry コマンドが $HOME/.cargo/bin に配置されます。これを使うと特定プロセスの実行ファイルとか見れます、たぶん*3。
ある意味参考実装的なものですね。
chiku2gonzalez@xenial:~$ pentry -h Show some process information. USAGE: pentry -h|--help pentry [-P|--parent] [PID [PID...]] Options: -h, --help Show this usage message. -P, --parent Inspect parent process entry. chiku2gonzalez@xenial:~$ .cargo/bin/pentry PID PPID PATH 5284 2379 /home/chiku2gonzalez/.cargo/bin/pentry chiku2gonzalez@xenial:~$ .cargo/bin/pentry -P PID PPID PATH 2379 2377 /bin/bash 5295 2379 ┗ /home/chiku2gonzalez/.cargo/bin/pentry chiku2gonzalez@xenial:~$
余談
とりあえず trait を Go の interface みたいにできないのがツライ(´・ω・`) *4