[英]Kill process by pid with boost process
我確實想殺死一個我有 pid 的進程,所以我的代碼如下:
pid_t pid = 28880;
boost::process::child process { pid };
std::cout << "Running: " << process.running() << "\n";
process.terminate();
我注意到盡管 running() 總是返回 false(無論我采用什么 pid)並且基於源代碼然后終止甚至沒有被調用。
再深入一點,似乎調用了 linux function waitpid
。 它總是返回 -1(這意味着發生了一些錯誤,而不是 0,這意味着:是的,進程仍在運行)。
WIFSIGNALED 返回 1,WTERMSIG 返回 5。
我在這里做錯了什么嗎?
Boost 進程是一個用於執行(和操作)子進程的庫。 您的不是(必然)子進程,也不是由 boost 創建的。
除非附加了進程,否則running()
確實不起作用。 根據定義使用該構造函數會導致分離過程。
這留下了一個有趣的問題,為什么這個構造函數存在,但讓我們關注這個問題。
無法加入或終止分離的進程。
terminate()
調用是空操作。
我建議自己編寫邏輯——代碼沒有那么復雜(POSIX kill
或TerminateProcess
)。
如果你願意,你可以通過使用庫中的實現細節來作弊:
#include <boost/process.hpp>
#include <iostream>
namespace bp = boost::process;
int main(int argc, char** argv) {
for (std::string_view arg : std::vector(argv + 1, argv + argc)) {
bp::child::child_handle pid{std::atoi(arg.data())};
std::cout << "pid " << pid.id();
std::error_code ec;
bp::detail::api::terminate(pid, ec);
std::cout << " killed: " << ec.message() << std::endl;
}
}
例如
cat &
./sotest $!
印刷
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.