簡體   English   中英

使用 boost 進程通過 pid 殺死進程

[英]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 killTerminateProcess )。

如果你願意,你可以通過使用庫中的實現細節來作弊

#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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM