unix - 您可以将 mut i8 转换为 i32 吗?
问题描述
我正在尝试构建一个小型终端仿真器,并且遇到了与 libc 的一些有趣的类型冲突。当我尝试设置 pty 连接的从属部分时,我需要使用对 ptsname() 的系统调用来创建从属,以便获取 pts 的名称,以便我可以访问它。但是,我收到一个类型错误,说 libc::ptsname() 需要 i32 作为输入。这与手册页直接冲突,手册页说它应该传递一个文件描述符。我只是想知道是否可以将文件描述符的 libc::c_int 转换为 i32 以传递给 ptsname。
代码如下:
use libc::{self, c_int, grantpt, posix_openpt, ptsname, unlockpt, O_RDWR};
use std::os::unix::io::FromRawFd;
use std::process::{Child, Command, Stdio};
#[derive(Debug)]
pub struct Pty {
process: Child,
fd: i32,
}
fn create_pty(process: &str) -> Pty {
let master: c_int;
unsafe {
// create master/slave pair of fd
master = posix_openpt(O_RDWR);
if master == -1 {
panic!("Failed to posix_openpt");
}
// set slave ownership and mode as master
let mut result = grantpt(master);
if result == -1 {
panic!("Failed to grantpt");
}
// unlock slave
result = unlockpt(master);
if result == -1 {
panic!("Failed to unlockpt");
}
}
let slave: c_int = ptsname(master as i32);
slave = libc::open(slave);
let mut builder = Command::new(process);
match builder.spawn() {
Ok(process) => {
let pty = Pty {
process,
fd: master,
};
pty
}
Err(e) => {
panic!("Failed to create pty: {}", e);
}
}
}
fn main() {
let shell = "/bin/bish";
let pty = create_pty(shell);
println!("{:?}", pty);
}
和控制台输出(现在可以忽略第二个错误):
error[E0308]: mismatched types
--> src/main.rs:42:24
|
42 | let slave: c_int = ptsname(master as i32);
| ^^^^^^^^^^^^^^^^^^^^^^ expected i32, found *-ptr
|
= note: expected type `i32`
found type `*mut i8`
error[E0060]: this function takes at least 2 parameters but 1 parameter was supplied
--> src/main.rs:43:13
|
43 | slave = libc::open(slave);
| ^^^^^^^^^^^^^^^^^ expected at least 2 parameters
error: aborting due to 2 previous errors
Some errors have detailed explanations: E0060, E0308.
For more information about an error, try `rustc --explain E0060`.
error: could not compile `experiment`.
解决方案
这并不是说它需要输入,i32
而是说您要ptsname(master as i32);
的是 type i32
。这可能有点令人困惑,因为c_int
它是 的别名i32
,所以听起来它要求的是不相关的类型。
问题是您在返回时给出slave
了 type (也是别名,这次是 for )。c_int
ptsname
*mut c_char
c_char
i8
推荐阅读
- ios - 创建单元格后是否有对 uitableviewcell 执行动画/移动?
- c# - 返回值的隐式类型转换
- objective-c - 如何保持应用程序始终响应?
- flutter - 从另一个应用程序 UI 使用 conecpt
- css - 使用 CSS 验证密码
- vue.js - Vue - 从 array.push 中的 select 传递参数
- reactjs - 反应导航v5中的问号而不是图标
- node.js - NodeJS - 将数据插入索引的弹性搜索
- c# - C# 8.0 中是否有针对非空值的“检查并获取”运算符?
- java - 如何解决 for 循环中的 InvocationTargetException?(寻找整个堆栈跟踪)