我正在尝试使用#![no_std]
和extern crate rlibc
编写新的初始化系统,并使用asm调用系统调用,目前尝试避免分配内存。因此,我可以使用的工具范围受到限制。
我需要调用execve系统调用,它需要一个char **argv
和一个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);
*const u8
而不是int
。as_ptr()
方法已经返回了一个*const u8
,所以你可以直接移除transmute
。要获取一个空指针,请使用ptr::null()
(或0 as *const T
)而不是0
。 - Francis Gagné\0
д»Јжӣҝ\x00
жқҘиЎЁзӨәз©әеӯ—иҠӮгҖӮ - Francis Gagnéargv1.as_ptr() as int
),但正如@FrancisGagné所建议的,最好存储一个&[*const u8]
。另外,你是否知道关键字use
,它允许将名称引入作用域,例如use core::mem; ... mem::transmute(...)
? - huon