使用 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 $!
版画
我确实想终止一个我有 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 $!
版画