有没有办法在Rust代码中使用unistd.h中的函数?

4

我正在尝试实现一个类似于malloc的函数,但是我不知道在C中该使用什么替代unistd.h中的sbrk函数。是否有办法将unistd.h FFI到Rust程序中?

1个回答

3

《Rust编程语言》一书中提供了一些关于FFI的好信息。如果你使用libccargo,你可以使用以下类似的内容。

extern crate libc;

use libc;

extern {
    fn sbrk(x: usize) -> *mut libc::c_void;
}

fn call_sbrk(x: usize) -> *mut libc::c_void {
    unsafe {
        sbrk(x)
    }
}

fn main() {
    let x = call_sbrk(42);
    println!("{:p}", x);
}

在您的Cargo.toml中添加以下内容:

[dependencies]
libc = "^0.2.7"

2
请注意:应该避免使用 pkg =“*” (http://doc.crates.io/faq.html#can-libraries-use--as-a-version-for-their-dependencies)。 - набиячлэвэли
谢谢你发现我的懒惰!这篇文章已经被编辑过了。 - Daniel Robertson
太好了,非常完美 - 我差一点就对了,我以为需要在那里加上一些 #[link(name = "")] 的东西,但是不知道该填什么名字。 - Harvey Adcock
1
如果你正在编写一个分配器,你可能也会对 Rust 中的这一章自定义分配器感兴趣。 - Daniel Robertson
@DanielRobertson,这看起来是一章有趣的内容,我得先解决我的分配器问题,然后再好好看看。我现在遇到了一些全局变量和FFI的问题 - 我已经按照章节上的说明进行操作,但链接器却说它们未定义,但名称前面已经加了下划线。例如,PROT_WRITE显示为_PROT_WRITE。你有什么想法吗? - Harvey Adcock
刚刚意识到它们不是全局变量,而是宏定义的常量,FFI 无法处理。 - Harvey Adcock

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接