4个版本

使用旧的Rust 2015

0.1.0 2016年12月10日
0.0.3 2016年6月21日
0.0.2 2016年5月11日
0.0.1 2016年3月27日

#18 in #exists


5个crate中使用(通过czmq

MIT/Apache

1MB
20K SLoC

rust-czmq 构建状态 覆盖率状态

Rust对CZMQ的绑定。文档可以在https://petehayes102.github.io/rust-czmq找到。

注意,这个库的大部分内容是不完整的。对于存在的模块,你可以找到像这样的注释

来自src/zmsg.rs

// pub fn zmsg_sendm(self_p: *mut *mut zmsg_t,
//                   dest: *mut ::std::os::raw::c_void)
//  -> ::std::os::raw::c_int;

这是对C库的FFI包装器,我将其用作Rust fn的占位符。尽管CZMQ是一个庞大的库,我仍会继续努力。总之,PR是最受欢迎的!:D

CZMQ

CZMQ是ZeroMQ的高级C绑定,它为复杂任务提供了有用的抽象,以及你通常需要自己编写的许多样板代码。

更多信息可以在https://czmq.zeromq.org找到。

多线程

CZMQ的ZSock结构在多线程中特别有用,因为CZMQ维护一个内部全局状态来共享单个上下文对象。这意味着你可以在多个线程中实例化新的ZSock,而无需显式共享上下文。

注意事项

请注意,我建议你在线程之间共享一个单个 ZSock。这是极其不安全的 :)

此外,警告你,每次调用ZSock都会触发对C fn zsys_init()的调用,它不是线程安全的!在第一次调用zsys_init()之后,从子线程中调用是安全的,但在之前,除非你喜欢panic,否则请避免在多个ZSock实例化之间创建竞争条件。

减轻此问题的最简单方法是,在开始创建子线程之前(你很可能会这样做),在你的主线程中创建一个ZSock。这将无争用地调用zsys_init()并安全地初始化全局ZSys状态。

对于无法控制主线程的情况(例如测试),你可以遵循我在这个库中使用的示例来运行安全的测试

来自src/lib.rs

#[cfg(test)]
use std::sync::{Once, ONCE_INIT};

#[cfg(test)]
static INIT_ZSYS: Once = ONCE_INIT;

#[cfg(test)]
fn zsys_init() {
    INIT_ZSYS.call_once(|| {
        unsafe { czmq_sys::zsys_init() };
    });
}

然后在你的测试中(或你想要保护ZSock::new()调用的任何地方)

#[test]
fn test_my_thing() {
    zsys_init();

    // Now go nuts...
}

Bindgen

要生成FFI代码(czmq-sys/src/ffi.rs),你需要rust-bindgen。克隆并构建这个仓库,然后使用它来生成绑定。

以下是一个示例命令

/path/to/bindgen -l czmq -o /path/to/rust-czmq/czmq-sys/src/ffi.rs -builtins /path/to/rust-czmq/czmq-sys/bindgen.h

对于OS X,我们可能还需要帮助Clang找到一些缺失的头文件。如果你看到如下错误...

/usr/local/include/czmq_prelude.h:177:13: fatal error: 'TargetConditionals.h' file not found

...那么你需要手动指定包含缺失头文件的目录(或多个目录)。

注意:你需要安装Xcode才能获取缺失的头文件。

以下是一个包含缺失头文件包含路径的示例命令

/path/to/bindgen -l czmq -o /path/to/rust-czmq/czmq-sys/src/ffi.rs -builtins -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk/usr/include/ /path/to/rust-czmq/czmq-sys/bindgen.h

如果上面的路径不存在(它可能不存在),或者你仍然在收到关于缺失头文件(.h文件)的错误,使用find来在你的机器上定位头文件。当你找到它们时,使用一个或多个如上例中的-I标志来手动指定它们的路径。

如果你仍然有困难,请随时提出工单,也许有人能帮你找到正确的方向。

路线图

  1. 通过用Rust fns替换FFI存根来完成现有模块
  2. 解决ZSock::send/recv的变长函数问题 - 将Rust的类型系统与C的void指针结合是困难的
  3. 在Rust中重现CZMQ示例
  4. 库的文档
  5. 继续全面支持库的痛苦追求

谢谢

Andrew Hobden表示敬意,感谢他的教程,关于自动将Rust文档发布到GitHub Pages!

这个库受到了erickt的Rust ZMQ绑定的启发。

依赖关系