< 返回版块

WingDust 发表于 2021-06-17 15:29

Tags:所有权

use std::{ io::Write, process::{Child, Command, Stdio}};

fn ffmpeg(err:fn()) ->Child  {
    let mut o = Command::new("ffmpeg")
        .arg("-f")
        .arg("gdigrab")
        .arg("-i")
        .arg("desktop")
        .arg("-pix_fmt")
        .arg("yuv420p")
        .arg("H:/b.mp4")
        .stdin(Stdio::piped())
        .stderr(Stdio::piped())
        .stdin(Stdio::piped())
        // .output()
        .spawn()
        .expect("error!");

    let output = o.wait_with_output().unwrap(); // move 移动发生在这
    if !output.status.success() {
        println!("{:#?}",String::from_utf8(output.stderr));
        err();
    }
    o // 导致这个返回报错
}

因为 标准库中的 Child 没有 Copy 特征 ,自己试了一些也是没用 我想正确返回 o 怎么处理

评论区

写评论
wdlfellow 2021-06-18 08:48

嗯,学习了

--
👇
Aya0wind: 读一下wait_with_output的官方文档

Simultaneously waits for the child to exit and collect all remaining output on the stdout/stderr handles, returning an Output instance.

你调用这个函数的时候,子进程已经退出了,之后你咋往里写?不然为啥这个函数要move掉o,因为子进程已经没了,你要读子进程的输出,直接读他的stdout即可。

Aya0wind 2021-06-17 17:54

读一下wait_with_output的官方文档

Simultaneously waits for the child to exit and collect all remaining output on the stdout/stderr handles, returning an Output instance.

你调用这个函数的时候,子进程已经退出了,之后你咋往里写?不然为啥这个函数要move掉o,因为子进程已经没了,你要读子进程的输出,直接读他的stdout即可。

作者 WingDust 2021-06-17 16:06

--
👇
WingDust:

--
👇
alexlee85: 问题不是出在你说的 标准库中的 Child 没有 Copy 特征 问题是你在使用 let output = o.wait_with_output().unwrap(); 这句话的时候,o这个Child的所有权已经转移了,所以你后面就不能用o这个变量了。

你可以直接返回output嘛

我要在其他地方 调用 o.stdin.as_mut().ok_or("qq").unwrap().write_all(b"q").unwrap(); output 没有 stdin 方法

alexlee85 2021-06-17 15:58

问题不是出在你说的 标准库中的 Child 没有 Copy 特征 问题是你在使用 let output = o.wait_with_output().unwrap(); 这句话的时候,o这个Child的所有权已经转移了,所以你后面就不能用o这个变量了。

你可以直接返回output嘛

1 共 4 条评论, 1 页