使用 Qt 在不知道完整路径的情况下终止进程

Posted

技术标签:

【中文标题】使用 Qt 在不知道完整路径的情况下终止进程【英文标题】:Kill process without knowing the full path using Qt 【发布时间】:2010-04-12 17:10:05 【问题描述】:

我正在尝试检索计算机上的活动进程并搜索特定的进程, 如果它存在,那么我应该杀死它。 是否可以在不知道执行的具体路径的情况下做到这一点? 我知道执行进程名称,但不知道完整路径。

简而言之:

    获取所有活动进程。 杀死特定进程。

谢谢!

【问题讨论】:

【参考方案1】:

AFAIK 没有特定于 Qt 的方式来做你想做的事,所以你必须使用原生平台 API。您对哪个平台(Widnows、Unix、MacOS)感兴趣?

编辑: 看看 MSDN 进程函数参考:http://msdn.microsoft.com/en-us/library/ms684847(v=VS.85).aspx,尤其是 EnumProcesses、OpenProcess 和 TerminateProcess。我不会给你任何代码 sn-ps,因为我自己没有使用过这个 API(我只是把它加了书签)。

【讨论】:

【参考方案2】:

就像说的那样,你可以使用 win api 相对容易地在 windows 上做到这一点:Enumerating All Processes && Terminating a Process

对于 linux,您可以尝试使用 QProcess 运行类似 "ps -A" 之类的东西并解析其标准输出;像这样:

QProcess process;
process.setProcessChannelMode(QProcess::MergedChannels);
process.start("ps",  QStringList() << "-A");
if (!process.waitForStarted())
    return;
if (!process.waitForFinished())
    return;

//qDebug() << process.readAll();    
QByteArray output = process.readLine().trimmed();
while (!output.isEmpty())

    qDebug() << output;
    QList<QByteArray> items = output.split(' ');
    qDebug() << "pid:" << items.first() << " cmd:" << items.last();
    qDebug() << "===============================================";
    output = process.readLine().trimmed();

这应该会返回一个正在运行的进程列表,您可以为ps 尝试不同的命令行选项来获取您需要的数据。我相信终止进程可以用同样的方式完成;通过运行kill [pid]

希望这能让您了解如何进行,问候

【讨论】:

【参考方案3】:

如果您使用的是 MacOS 或 BSD,您可以使用 sysctl API 列出所有进程。

在 Linux 上,您可以做的最好的事情似乎是在 source code to ps 中查看它是如何完成的,这基本上是在 /proc file system 中导航。

【讨论】:

以上是关于使用 Qt 在不知道完整路径的情况下终止进程的主要内容,如果未能解决你的问题,请参考以下文章

在不知道进程启动顺序的情况下在另一个进程上触发事件

使用ant,在不知道完整路径的情况下重命名目录?

如何在不终止正在运行的 jar 文件进程的情况下关闭终端 [重复]

在 Unix 上的 C 中,进程如何在不打开文件的情况下知道它对文件具都有哪些权限?

QT 进程基础 QT如何判断另外一个进程在运行

进程被强制终止时的进程退出代码