跨平台杀死指定名称的进程(Windows系统和Linux系统)

/**
 * @brief 跨平台杀死指定名称的进程
 * @param processName 要杀死的进程名称
 */
void MainWindow::killProgram(const QString &processName)
{
#ifdef Q_OS_WIN  // Windows 平台特定代码
    // 创建一个新的 QProcess 对象,用于执行系统命令
    QProcess process;
    
    // 启动 tasklist 命令,查找指定名称的进程
    // /FI 参数表示筛选,IMAGENAME eq 表示按照镜像名称匹配
    process.start("tasklist", QStringList() << "/FI" << QString("IMAGENAME eq %1").arg(processName));
    
    // 等待命令执行完成
    process.waitForFinished();
    
    // 读取命令执行的标准输出
    QString output = process.readAllStandardOutput();

    // 检查进程名称是否在输出中存在,如果存在则说明进程正在运行
    if(output.contains(processName))
    {
        // 创建另一个 QProcess 对象,用于杀死进程
        QProcess process1;
        
        // 启动 taskkill 命令,强制杀死指定名称的进程
        // /F 参数表示强制杀死,/IM 参数表示按照镜像名称指定进程
        process1.start("taskkill", QStringList() << "/F" << "/IM" << processName);
        
        // 等待命令执行完成
        process1.waitForFinished();
        
        // 读取可能的错误输出
        QString error = process1.readAllStandardError();

        // 检查进程是否成功被杀死
        bool success = process1.exitCode() == 0;
        
        // 根据结果输出日志
        if (!success)
            qDebug() << u8"关闭进程失败:" << QString(u8"%1").arg(error);
        else
            qDebug() << u8"关闭进程成功:" << processName;
    }
    
#else  // Linux/Unix 平台特定代码
    // 创建 QProcess 对象用于执行命令
    QProcess process;
    
    // 使用 ps 命令查找进程
    // -e 表示所有进程,-o 指定输出格式,grep 筛选指定进程名
    process.start("bash", QStringList() << "-c" << QString("ps -e -o pid,comm | grep %1").arg(processName));
    
    // 等待命令执行完成
    process.waitForFinished();
    
    // 读取命令输出
    QString output = process.readAllStandardOutput();
    
    // 检查进程是否存在
    if(!output.isEmpty())
    {
        // 使用正则表达式从输出中提取 PID
        QRegExp rx("\\s*(\\d+)\\s+.*");
        QStringList pidList;
        
        QTextStream stream(&output);
        QString line;
        
        // 遍历输出的每一行,提取 PID
        while(stream.readLineInto(&line)) {
            if(rx.indexIn(line) != -1) {
                QString pid = rx.cap(1);
                pidList << pid;
            }
        }
        
        // 检查是否找到了 PID
        if(!pidList.isEmpty()) {
            bool success = true;
            
            // 对每个找到的 PID 执行 kill 命令
            for(const QString &pid : pidList) {
                QProcess killProcess;
                
                // 使用 kill 命令终止进程,-9 表示强制终止
                killProcess.start("kill", QStringList() << "-9" << pid);
                
                // 等待 kill 命令执行完成
                killProcess.waitForFinished();
                
                // 如果 kill 命令返回非零状态,表示失败
                if(killProcess.exitCode() != 0) {
                    success = false;
                    qDebug() << u8"关闭进程失败 (PID:" << pid << "):" << killProcess.readAllStandardError();
                }
            }
            
            // 输出总体结果
            if(success)
                qDebug() << u8"关闭进程成功:" << processName;
            else
                qDebug() << u8"部分或全部进程关闭失败:" << processName;
        }
        else {
            // 没有找到有效的 PID
            qDebug() << u8"找到进程但无法获取有效 PID:" << processName;
        }
    }
    else {
        // 没有找到进程
        qDebug() << u8"未找到进程:" << processName;
    }
#endif
}

你可能感兴趣的:(C++,Linux进阶,Qt,windows,linux)