1

我确实想杀死一个我有 pid 的进程,所以我的代码如下:

pid_t pid = 28880;
boost::process::child process { pid };
std::cout << "Running: " << process.running() << "\n";
process.terminate();

我注意到虽然 running() 总是返回 false (无论我采用什么 pid)并且基于源代码然后终止甚至没有被调用。

挖掘得更深一点,似乎waitpid是调用了 linux 函数。它总是返回 -1(这意味着发生了一些错误,而不是 0,这意味着:是的,该进程仍在运行)。

WIFSIGNALED 返回 1,WTERMSIG 返回 5。

我在这里做错了吗?

4

1 回答 1

2

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

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

这留下了一个有趣的问题,为什么这个构造函数存在,但让我们关注这个问题。

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

terminate()通话是无操作的。

我建议自己编写逻辑 - 代码并不复杂(POSIXkillTerminateProcess)。

如果你愿意,你可以通过使用库中的实现细节来作弊:

#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 $!

印刷

在此处输入图像描述

于 2021-10-09T15:13:42.397 回答