10

我正在使用一个新的初始化系统,#![no_std]extern crate rlibc使用 asm 进行系统调用,目前也试图不分配内存。所以我拥有的可能工具的范围是有限的。

我需要调用 execve 系统调用,它需要 achar** argv和 a char **envp。我可以将 c 风格的字符串组合成带有零的字节数组,但是如何以空值终止静态声明的此类列表(最后一个指针为 NULL)

4

1 回答 1

7

睡在上面之后,我醒来时得到了答案,现在对我来说似乎很明显。使用整数切片并将最后一个设置为 0。

// Execute something as an example:
let filename: &[u8] = b"/usr/bin/sensors\x00";     // <-- Make c strings like this
let argv1: &[u8] = b"/usr/bin/sensors\x00";
let argv2: &[u8] = b"-h\x00";
let argv: &[int] = [                               // <-- store them in this
    ::core::intrinsics::transmute(argv1.as_ptr()), // <-- transmuting 
    ::core::intrinsics::transmute(argv2.as_ptr()),
    0                                              // <-- and NULL terminate
];
let envp: &[int] = [0];

::linux64::execve(filename,argv,envp);
于 2014-07-26T19:04:25.287 回答