37 个版本
0.11.7 | 2022年4月27日 |
---|---|
0.11.5 | 2022年3月27日 |
0.9.0 | 2021年11月27日 |
0.8.2 | 2021年4月8日 |
0.8.0 | 2021年3月31日 |
#478 in 文件系统
54 每月下载量
用于 4 crates
41KB
974 行
警告
这个库目前不稳定,没有实现可靠的跨平台功能。虽然它在某些特定情况下可以工作,但异常太多,不足以称之为生产就绪。
这个项目处于危险之中!
正确的解决方案是创建(或找到)独特且完整的 crates,分别封装 Windows 和 Unix 的功能,然后将这些功能转化为(一个或多个)利用这些功能的特定、跨平台的实现。我目前没有时间优先处理这个问题,因此我在寻找有兴趣接管这个项目的人。我对高、低层次上需要做什么有一个相当清晰的认识,并且愿意至少花时间去转移我所拥有的知识。否则,除非我的情况有所改变,我发现自己有更多空闲时间,否则这个项目可能会失败。如果您有兴趣,请通过 github、reddit /u/eolu
或 discord Eolu#3431
联系我。
ipipe - 为 Rust 提供的跨平台命名管道库
这个库允许创建平台无关的命名管道。实现了标准的 Read/Write 特性。API 和性能将在未来的版本中改进。欢迎提出问题和 PR。
示例
use ipipe::Pipe;
use std::thread;
use std::io::{BufRead, BufWriter};
const CANCEL: u8 = 24;
fn main()
{
let mut pipe = Pipe::create().unwrap();
println!("Name: {}", pipe.path().display());
let writer = pipe.clone();
thread::spawn(move || print_nums(writer));
for line in BufReader::new(pipe).lines()
{
println!("{}", line.unwrap());
}
}
fn print_nums(mut pipe: Pipe)
{
for i in 1..=10
{
writeln!(&mut pipe, "{}", i).unwrap();
}
write!(&mut pipe, "{}", CANCEL as char).unwrap();
}
运行上面的示例程序将输出
1
2
3
4
5
6
7
8
9
10
Pipe::create
在临时位置生成一个随机管道名称。示例路径(Windows):\\.\pipe\pipe_23676_xMvclVhNKcg6iGf
示例路径(Unix):/tmp/pipe_1230_mFP8dx8uVl
Pipe::with_name
允许指定管道名称。
关于读写的一些建议
要在多个地方读写相同的管道,应使用 Pipe::clone
来共享管道。管道实例包含一个内部的 Arc
,它将维护管道的原始句柄,直到最后一个实例被丢弃。目前为创建指向同一管道的两个单独句柄的行为是未定义的。这是一个正在调查的问题。
特性
-
static_pipe
默认的 static_pipe
功能允许创建互斥量保护的静态管道,可以从程序中的任何位置以类似于 stdout 的方式写入。以下是一个示例
use ipipe::*;
use std::io::{BufRead, BufWriter};
let mut reader = ipipe::init("my_out").unwrap();
// You can get a handle to an already-initialized pipe like this:
// let mut reader = ipipe::get("my_pipe");
let s = BufReader::new(pipe).lines().next().unwrap();
println!("String received: {}", s);
// Drops the static pipe. Can also call `ipipe::close_all()` to drop all static pipes.
ipipe::close("my_out");
然后,在程序(或具有足够权限访问管道的另一个程序)的任何位置都可以写入如下代码
pprintln!("my_pipe", "This text will be sent over the pipe!");
未来版本也将计划提供更底层和更完整/直观的静态管道 API。
-
rand
默认的 rand
功能将允许调用 Pipe::create()
以随机生成的名称打开一个管道。生成的名称将具有以下格式:pipe_[进程 pid]_[15 随机字母数字字符]
。在其他所有方面与 Pipe::with_name(&str)
相当。
-
channels
channels
功能将允许调用 pipe.receiver()
和 pipe.sender()
以生成一个通道。通道的一端将被发送到线程以监视管道的输入或输出,而另一端将被返回。
-
tokio_channels
与 channels
功能相同,但使用 tokio::task
代替 std::thread
。
依赖项
~2–41MB
~591K SLoC