TL; DR: используйте метод kill .Например:
use std::process;
use std::thread;
use std::time::Duration;
fn main() {
let mut child = process::Command::new("ping")
.arg("8.8.8.8")
.arg("-t")
.spawn()
.expect("Couldn't run 'ping'");
thread::sleep(Duration::from_secs(5));
child.kill().expect("!kill");
}
Обратите внимание, что вам не нужен отдельный поток, поскольку порожденный процесс уже параллелен родительскому процессу.
В вашем вопросе есть пример кодакоторый использует «cmd / C» для запуска «ping».Это порождает не один, а два процесса: процесс «cmd» и процесс «ping».Уничтожение child
убьет процесс «cmd», но может привести к тому, что процесс «ping» будет запущен.
Использование «cmd / C» также опасно, допуская внедрение команды .
Как получить доступ к _child
, созданному в функции create_process
, чтобы завершить его процесс?
_child
равен Send
, что означает, что вы можете отправить его из потока в поток.Особенности отправки данных между потоками, вероятно, уже были рассмотрены в ряде соответствующих вопросов переполнения стека.
Есть ли другие способы убить этот процесс?
Вы можете использовать API-интерфейсы собственной платформы.Например:
[dependencies]
gstuff = "0.5.2"
winapi = {version = "0.3.6", features = ["psapi", "shellapi"]}
#[macro_use]
extern crate gstuff;
use std::process;
use std::ptr::null_mut;
use std::thread;
use std::time::Duration;
use winapi::shared::minwindef::DWORD;
use winapi::shared::ntdef::HANDLE;
use winapi::um::processthreadsapi::{OpenProcess, TerminateProcess};
use winapi::um::winnt::{PROCESS_QUERY_INFORMATION, PROCESS_TERMINATE};
struct Process(HANDLE);
impl Process {
fn open(pid: DWORD) -> Result<Process, String> {
// https://msdn.microsoft.com/en-us/library/windows/desktop/ms684320%28v=vs.85%29.aspx
let pc = unsafe { OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_TERMINATE, 0, pid) };
if pc == null_mut() {
return ERR!("!OpenProcess");
}
Ok(Process(pc))
}
fn kill(self) -> Result<(), String> {
unsafe { TerminateProcess(self.0, 1) };
Ok(())
}
}
impl Drop for Process {
fn drop(&mut self) {
unsafe { winapi::um::handleapi::CloseHandle(self.0) };
}
}
fn main() {
let child = process::Command::new("ping")
.arg("8.8.8.8")
.arg("-t")
.spawn()
.expect("Couldn't run 'ping'");
let pid = child.id();
let pc = Process::open(pid as DWORD).expect("!open");
println!("Process {} opened.", pid);
thread::sleep(Duration::from_secs(5));
pc.kill().expect("!kill");
println!("Process {} killed.", pid);
}