use wslcsdk::{ContainerBuilder, ProcessBuilder, SessionBuilder, WslcSignal};
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let session = SessionBuilder::new_default("example-streaming")?.build()?;
let container = ContainerBuilder::new("alpine:latest").build(&session)?;
container.start(false)?;
let (builder, mut streams) = ProcessBuilder::new()
.command(&["/bin/sh", "-c", "echo '来自 WSL 容器的问候' && ls -la /"])
.working_directory("/")
.env("EXAMPLE_ENV", "wslcsdk")
.with_streaming_io();
let process = builder.spawn(&container)?;
println!("进程已派生,PID: {}", process.pid()?);
while let Some(chunk) = streams.stdout.recv().await {
print!("{}", String::from_utf8_lossy(&chunk));
}
while let Some(chunk) = streams.stderr.recv().await {
eprint!("{}", String::from_utf8_lossy(&chunk));
}
let exit_code = streams.wait_exit().await?;
println!("进程退出码: {exit_code}");
let dropped = streams.stdout_dropped_bytes() + streams.stderr_dropped_bytes();
if dropped > 0 {
eprintln!(
"警告: 因消费不及时共丢弃 {dropped} 字节输出,可改用 with_streaming_io_capacity 增大缓冲"
);
}
container.stop(WslcSignal::Sigterm, 5)?;
container.delete(false)?;
session.terminate()?;
Ok(())
}