4个版本
使用旧的Rust 2015
0.2.0 | 2018年9月22日 |
---|---|
0.1.3 | 2017年10月16日 |
0.1.2 | 2017年10月4日 |
0.1.1 | 2017年10月4日 |
#702 in Unix API
11KB
78 代码行(不含注释)
Nix ptsname_r()
桥接器
使用此桥接器的 ptsname_r()
替代 Nix 的 ptsname_r()
在 Linux 上可以使您的应用程序在 ptsname_r()
方面可移植到 macOS。此 crate 暴露的 ptsname_r()
简单地引用 Linux 上的 Nix 原始的 ptsname_r()
并在 macOS 上使用其桥接器。函数签名和行为是相同的。
用法
以下是一个如何将此桥接器用于现有程序并使用 Nix 的 ptsname_r
的示例。
之前
使用不适用于 macOS 的 Nix 的 ptsname_r()
extern crate nix;
use nix::fcntl::O_RDWR;
use nix::pty::{posix_openpt, ptsname_r};
fn main() {
let master_fd = posix_openpt(O_RDWR).unwrap();
let slave_name = ptsname_r(&master_fd).unwrap();
println!("Slave Name was: {}", slave_name);
}
之后
使用 Nix ptsname_r()
桥接器的 ptsname_r()
,它在 macOS 上提供等效功能,但在其他平台上回退到 Nix 的 ptsname_r()
extern crate nix;
use nix::fcntl::O_RDWR;
// Remove use of Nix's ptsname_r
use nix::pty::posix_openpt;
// Add this crate and use its ptsname_r
extern crate nix_ptsname_r_shim;
use nix_ptsname_r_shim::ptsname_r;
fn main() {
let master_fd = posix_openpt(O_RDWR).unwrap();
let slave_name = ptsname_r(&master_fd).unwrap();
println!("Slave Name was: {}", slave_name);
}
背景
在 POSIX 中,ptsname()
用于由 posix_openpt
创建的文件描述符,以获取从属伪终端的名称。
不幸的是,ptsname()
通过修改全局变量来返回指向包含从属名称的修改后的变量的指针。在 Rust 的 Nix 中,这被视为不安全。它也不是线程安全的,可能在信号处理期间以及其他问题中引起问题。因此,Nix 中的实现被标记为 unsafe
。
作为回应,在Linux平台上,存在一个名为ptsname_r()
的函数,它是ptsname()
的重入式和更安全的版本,因为它将数据写入调用者提供的缓冲区。在Nix中,它分配一个缓冲区并将其包装在一个拥有的String
中,以使其更安全。
遗憾的是,macOS/Darwin不包含ptsname_r()
函数。作为替代,您需要使用TIOCPTYGNAME
系统调用,并将主文件描述符和缓冲区指针作为参数。它几乎与ptsname_r()
相同,但仍有区别。
确定这不是Nix的范畴,为确实具有该功能但底层调用不同的平台包含此类模拟器。 应将该仿真的功能移动到外部crate。
这超出了范围,但需要一个这样的模拟器,如下两个示例所示,它们已实现类似的模拟器
-
这个示例是我找到的第一个采用这种方法。作者使用它进行我假设是在某个大型托管提供商的工作相关的事情。我不确定作者确切地用它来做什么,但作者需要
ptsname_r
功能。作者没有使用nix
,但我可以看到作者cfg
将这些类似的nix
包装器门控到OS。我猜作者也希望在Linux和macOS之间保持相似的API。这个版本可能是以下参考的基础。 -
我的另一个示例正在进行pexpect克隆。为了进行pexpect克隆,作者必须通过名称打开从属终端,他必须通过
ptsname_r
找到它,然后在调用exec之前将其分配到正确的描述符。与第一个参考不同,作者使用nix
,但在macOS中为nix/macOS
所缺乏的几乎实现了ptsname_r
的polyfills。像我和前面的示例一样,作者也用类似的API为macOS填补了空白,以仿制Linux版本。
许可证
根据您选择的以下许可证之一获得许可:
- Apache许可证2.0版(LICENSE-APACHE或https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT许可证(LICENSE-MIT或http://opensource.org/licenses/MIT)
供您选择。
贡献
除非您明确说明,否则您有意提交给作品并包括在内的任何贡献,根据Apache-2.0许可证的定义,应双重许可,如上所述,没有其他条款或条件。
依赖关系
~1.5MB
~36K SLoC