Quando quero esperar que um processo filho termine, faço uma Child::wait()
chamada:
let exit_status = Command::new("sudo")
.args(["umount", mountpoint])
.spawn()
.expect("Failed to spawn umount command")
.wait()
.expect("Failure while waiting for umount command");
Este método retorna um Result<ExitStatus>
. Se o programa terminar com um erro, ele retornará para mim um Ok(ExitStatus)
que indica um código de saída diferente de zero. Então eu me pergunto por que esse método é falível... Em qual contexto a espera falha, mas o processo filho em si não?
A documentação não menciona o motivo, mas o trecho de código fornece uma sugestão:
// Code from the docs example.
use std::process::Command;
let mut command = Command::new("ls");
if let Ok(mut child) = command.spawn() {
child.wait().expect("command wasn't running");
println!("Child has finished its execution!");
} else {
println!("ls command didn't start");
}
"Command não estava rodando"? Mas o spawning ocorreu bem. Alguém tem alguma pista?
No Linux, isso se traduz em
wait
syscall, que pode sinalizar erros. Portanto, a API Rust deve ser falível, caso contrário, erros no nível de syscall não poderiam ser reportados.Como exemplo de como isso pode falhar, se você tiver definido manualmente a ação para
SIGCHLD
,SIG_IGN
então os processos filhos são automaticamente colhidos pelo kernel. Umawait
syscall em um filho que foi encerrado resultará em umECHILD
erro.