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 文件系统

Download history 25/week @ 2024-03-11 19/week @ 2024-03-18 50/week @ 2024-03-25 126/week @ 2024-04-01 10/week @ 2024-04-08 9/week @ 2024-04-15 13/week @ 2024-04-22 15/week @ 2024-04-29 13/week @ 2024-05-06 6/week @ 2024-05-13 10/week @ 2024-05-20 9/week @ 2024-05-27 17/week @ 2024-06-03 12/week @ 2024-06-10 14/week @ 2024-06-17 11/week @ 2024-06-24

54 每月下载量
用于 4 crates

MIT/Apache

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