Я пытался написать оболочку на Rust, которая напрямую связана с библиотекой libc
. Я использовал Vec<String>
для хранения аргументов, которые должны быть переданы в execvp()
, но похоже, что мое преобразование в char **
не увенчалось успехом. После выполнения все параметры стали нулевыми строками.
Вот часть кода.
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
— библиотечная функция C, определенная как fn execvp(file: *const i8, argv: *const*const i8) -> i32;
.
Я не уверен, что я сделал неправильно. Это потому, что память для аргументов была освобождена до вызова execvp()
?