私は、libc
ライブラリに直接リンクするRustのシェルを書こうとしていました。 Vec<String>
を使用して、引数をexecvp()
に渡しましたが、char **
への変換が成功していないようです。実行時に、すべてのパラメータがNULL文字列になりました。RustのVec <String>をCのC ** **に転送する
ここにコードがあります。
fn safe_execvp(path: String, argv: Vec<String>) -> Result<(), i32> {
unsafe {
let c_path = CString::new(path.as_str()).unwrap();
let mut c_argv_vec = Vec::new();
for arg in &argv {
let c_arg = CString::new(arg.as_str()).unwrap().as_ptr();
c_argv_vec.push(c_arg);
}
c_argv_vec.push(std::ptr::null());
match execvp(c_file.as_ptr(), c_argv_vec.as_ptr()) {
num => Err(num),
}
}
}
execvp
fn execvp(file: *const i8, argv: *const*const i8) -> i32;
として定義されるCライブラリ関数です。
私は何が間違っているのか分かりません。それは、引数のメモリがexecvp()
にコールする前に解放されたからでしょうか?
ありがとう!私は 'CString'をベクトルに保つべきだったと思います。 –