나는 Rust에서 libc
라이브러리로 직접 연결되는 셸을 작성하려고 시도 해왔다. Vec<String>
을 사용하여 인수를 execvp()
으로 전달했지만 char **
으로 변환하지 못한 것 같습니다. 실행시 모든 매개 변수가 널 문자열이되었습니다.Rust에서 Vec <String>을 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'을 벡터 안에 두어야한다고 생각합니다. –