您可以将 mut i8 转换为 i32 吗?

Can you convert a mut i8 into an 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); 的类型是 i32.这可能有点令人困惑,因为 c_inti32 的别名,所以它听起来像是在要求一个不相关的类型。

问题是您给 slave 类型 c_int,而 ptsname returns *mut c_charc_char 也是别名,这次是 i8).