在 Linux 系统中,如果你在 C++ 程序中使用 sh -c
启动了一个进程,并且希望杀死该进程及其所有子进程,可以使用以下方法:
sh -c
命令启动的进程的 PID。以下是一个示例代码,展示了如何在 C++ 中实现这一过程:
#include <iostream>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <signal.h>
#include <vector>
#include <cstring>
#include <sstream>
#include <fstream>
// 获取给定进程的所有子进程
std::vector<pid_t> getChildProcesses(pid_t pid) {
std::vector<pid_t> childPids;
std::ifstream proc("/proc/" + std::to_string(pid) + "/task/" + std::to_string(pid) + "/children");
if (proc) {
std::string line;
std::getline(proc, line);
std::istringstream iss(line);
pid_t childPid;
while (iss >> childPid) {
childPids.push_back(childPid);
}
}
return childPids;
}
// 递归杀死进程及其所有子进程
void killProcessTree(pid_t pid) {
std::vector<pid_t> childPids = getChildProcesses(pid);
for (pid_t childPid : childPids) {
killProcessTree(childPid);
}
kill(pid, SIGKILL);
}
int main() {
pid_t pid = fork();
if (pid == 0) {
// 子进程
execl("/bin/sh", "sh", "-c", "sleep 100", (char *)NULL);
// 如果 execl 失败
std::cerr << "execl failed: " << strerror(errno) << std::endl;
return 1;
} else if (pid > 0) {
// 父进程
std::cout << "Started process with PID: " << pid << std::endl;
sleep(5); // 等待一段时间,模拟一些操作
// 杀死进程及其所有子进程
killProcessTree(pid);
std::cout << "Killed process tree with root PID: " << pid << std::endl;
// 等待子进程结束
waitpid(pid, NULL, 0);
} else {
// fork 失败
std::cerr << "fork failed: " << strerror(errno) << std::endl;
return 1;
}
return 0;
}
getChildProcesses
函数读取 /proc/[pid]/task/[pid]/children
文件来获取给定进程的所有子进程。killProcessTree
函数递归地获取并杀死所有子进程,然后杀死自身。fork
创建一个子进程,并使用 execl
执行 sh -c "sleep 100"
命令。killProcessTree
函数来杀死子进程及其所有子进程。/proc
文件系统和杀死进程。SIGTERM
)而不是直接使用 SIGKILL
。领取专属 10元无门槛券
手把手带您无忧上云