2个版本
0.1.4 | 2021年5月19日 |
---|---|
0.1.3 | 2020年10月19日 |
#407 in 操作系统
16KB
244 行
此仓库已废弃
此库已重命名并迁移到 wasmedge_process_interface
。请跟进新的 wasmedge_process_interface 包以进行进一步开发。此仓库将不再进行开发。
SSVM进程接口
一个Rust库,为Rust到WebAssembly的开发者提供在他们的Wasm在SecondState的SSVM上执行时的运行命令功能的语法。
从高层次概述来看,我们实际上正在构建一个进程接口,将允许本地操作系统(SSVM在其中运行)在运行时执行中发挥作用。具体来说,作为Wasm执行的一部分执行带有参数和环境值的命令。
如何使用此库
Rust依赖项
开发者将 ssvm_process_interface
包 作为依赖项添加到他们的 Rust -> Wasm
应用程序中。例如,将以下行添加到应用程序的 Cargo.toml
文件中。
[dependencies]
ssvm_process_interface = "^0.1.3"
开发者将在他们的 Rust -> Wasm
应用程序代码中将 ssvm_process_interface
的 Command
模块引入作用域。例如,将以下代码添加到他们的 main.rs
文件顶部。
use ssvm_process_interface::Command;
使用程序名执行命令
开发者可以使用如下语法执行命令,例如使用 std::process::Command
。编译后,输出目标Wasm文件将包含关于运行外部命令的主机函数导入。
创建命令对象
let mut cmd = Command::new("ls");
添加参数
let mut cmd = Command::new("ls");
cmd.arg("-al");
或者以下内容
let cmd = Command::new("ls").arg("-al");
或者以下内容
let cmd = Command::new("ls").arg("-alF").arg("..");
或者以下内容
let cmd = Command::new("ls").args(&["-alF", ".."]);
添加环境变量
let mut cmd = Command::new("printenv").arg("ONE").env("ONE", "1");
或者以下内容
use std::collections::HashMap;
let mut cmd = Command::new("rusttest");
let mut hash: HashMap<String, String> = HashMap::new();
hash.insert(String::from("ENV1"), String::from("VALUE1"));
hash.insert(String::from("ENV2"), String::from("VALUE2"));
let mut cmd = Command::new("printenv").arg("ENV1").envs(hash);
添加 stdin
let mut cmd = Command::new("python3").stdin("print(\"HELLO PYTHON\")");
或者以下内容
// Consider about the `\n` charactor in stdin strings.
let mut cmd = Command::new("python3").stdin("import time\n").stdin("print(time.time())");
指定执行超时
// Timeout values are in milliseconds.
let mut cmd = Command::new("python3")
.stdin("from time import sleep\n")
.stdin("print('PYTHON start sleep 2s', flush=True)\n")
.stdin("sleep(2)\n")
.stdin("print('PYTHON end sleep 2s', flush=True)\n")
.timeout(1000);
执行并获取输出
请记住检查子进程的返回状态。
let out = Command::new("python3")
.stdin("from time import sleep\n")
.stdin("import sys\n")
.stdin("print('stdout: PYTHON start sleep 2s', flush=True)\n")
.stdin("print('stderr: PYTHON start sleep 2s', file=sys.stderr, flush=True)\n")
.stdin("sleep(2)\n")
.stdin("print('stdout: PYTHON end sleep 2s', flush=True)\n")
.stdin("print('stderr: PYTHON end sleep 2s', file=sys.stderr, flush=True)\n")
.timeout(1000)
.output();
println!(" return code : {}", out.status);
println!(" stdout :");
print!("{}", str::from_utf8(&out.stdout).expect("GET STDOUT ERR"));
println!(" stderr :");
print!("{}", str::from_utf8(&out.stderr).expect("GET STDERR ERR"));
Crates.io
官方crate可在crates.io找到。