小编Jia*_*Liu的帖子

将Rust中的Vec <String>传递给C中的char**

我一直在尝试在Rust中编写一个直接链接到libc库的shell .我用a 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),
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

execvp是C库函数定义为fn execvp(file: *const i8, argv: *const*const i8) -> i32;.

我不确定我做错了什么.是因为参数的内存在调用之前被释放了execvp()吗?

unsafe libc execvp rust

3
推荐指数
2
解决办法
935
查看次数

标签 统计

execvp ×1

libc ×1

rust ×1

unsafe ×1