使用 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();

我注意到 运行() 总是 returns false(无论我使用什么 pid)并且根据源代码甚至没有调用终止。

再深入一点,似乎调用了 linux 函数 waitpid。它总是 returns -1(这意味着发生了一些错误,而不是 0,这意味着:是的,过程仍然是 运行)。

WIFSIGNALED return 1 和 WTERMSIG returns 5.

我是不是做错了什么?

Boost 进程是一个用于执行(和操作)子进程的库。您的不是(必然)子进程,也不是由 boost 创建的。

确实 running() 不工作,除非进程被附加。根据定义使用该构造函数会导致分离过程。

This leaves the interesting question why this constructor exists, but let's focus on the question.

无法加入或终止分离的进程。

terminate() 调用是空操作。

我建议您自己编写逻辑 - 代码没有那么复杂 (POSIX kill or 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 $!

版画