Trait std::os::unix::process::CommandExt 1.0.0[−][src]
pub trait CommandExt: Sealed { fn uid(&mut self, id: u32) -> &mut Command; fn gid(&mut self, id: u32) -> &mut Command; fn groups(&mut self, groups: &[u32]) -> &mut Command; unsafe fn pre_exec<F>(&mut self, f: F) -> &mut Command
where
F: FnMut() -> Result<()> + Send + Sync + 'static; fn exec(&mut self) -> Error; fn arg0<S>(&mut self, arg: S) -> &mut Command
where
S: AsRef<OsStr>; fn before_exec<F>(&mut self, f: F) -> &mut Command
where
F: FnMut() -> Result<()> + Send + Sync + 'static, { ... } }
Expand description
process::Command
构建器的特定于 Unix 的扩展。
trait 是密封的: 不能在标准库之外实现。 这是为了将来的附加方法不会破坏更改。
Required methods
设置子进程的用户 ID。
这将转换为子进程中的 setuid
调用。
setuid
调用失败将导致 spawn 失败。
计划在 exec
函数被调用之前运行一个闭包。
允许闭包返回 I/O 错误,该错误的 OS 错误代码将被传达回父级,并从请求 spawn 开始作为错误返回。
可以注册多个闭包,并且将按照注册顺序对其进行调用。如果闭包返回 Err
,则不会再调用任何闭包,并且 spawn 操作将立即失败返回。
注意和安全
fork
之后,此闭包将在子进程的上下文中运行。这主要意味着,代表此闭包对内存所做的任何修改对于父进程都是不可见的。
这通常是一个非常受限制的环境,无法保证正常操作 (如 malloc
,通过 std::env
访问环境变量或获取互斥锁) (由于运行 fork
时可能仍在运行其他线程)。
有关更多详细信息,请参见 POSIX fork() specification 和任何目标平台的等效文档,尤其是有关 async-signal-safety 的要求。
这也意味着所有资源 (例如文件描述符和内存映射的区域) 都被复制了。您有责任通过无效使用这些重复项来确保闭包不违反库不变式。
只有当 panic 消息的所有格式参数都可以安全格式化时,闭包中的 panic 才是安全的; 这是因为尽管 Command
在调用 pre_exec hook 之前调用了 std::panic::always_abort
,但 panic 仍会尝试格式化 panic 消息。
运行此闭包时,已成功更改了诸如标准输入输出文件描述符和工作目录之类的内容,因此在预期的位置可能不会显示输出到这些位置。
通过此 Command
执行所有必需的设置,然后调用 execvp
syscall。
成功后,该函数将不会返回,否则它将返回错误,指示 exec (或 Command
的另一部分安装) 失败的原因。
exec
不返回与调用 process::exit
具有相同的含义 - 当前栈或任何其他线程的栈上都不会运行析构函数。因此,建议仅在不运行任何析构函数的时候调用 exec
。
请注意,execvp
系统调用独立保证释放所有内存,并关闭所有带有 CLOEXEC
选项的文件描述符 (默认情况下在标准库打开的所有文件描述符上设置)。
与 spawn
不同,此函数不会使用 fork
来创建一个新的子进程。但是,与 spawn 一样,标准输入输出描述符的默认行为将继承自当前进程。
Notes
如果此函数返回错误,则该进程可能在 “broken state” 中。例如,工作目录,环境变量,信号处理设置,各种 user/group 信息或标准输入输出文件描述符的各个方面可能已更改。
如果需要 “transactional spawn” 来妥善处理错误,建议改用跨平台 spawn
。