我正在使用一个新的init系统#![no_std]和extern crate rlibcasm进行系统调用,并且当前也试图不分配内存.因此,我所拥有的可能工具的范围是有限的.
我需要调用execve系统调用,它需要a char** argv和a char **envp.我可以将c风格的字符串作为零的字节数组合在一起,但是我怎么能无效地终止静态声明的这样的列表(最后一个指针是NULL)?
在睡觉之后,我醒了回答,现在我觉得很明显.使用整数切片并将最后一个设置为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);
Run Code Online (Sandbox Code Playgroud)