You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Linux下Qt5/C++环境中,子进程如何获取父进程的PID/名称?

Linux Qt5/C++环境下进程B获取父进程PID与名称的方法

进程B完全可以获取启动它的父进程(进程A)的PID和名称,具体实现方法如下:

获取父进程PID

直接调用Linux标准POSIX接口getppid()即可,该接口会返回当前进程的父进程PID,在你的场景中返回值就是1。示例代码:

#include <unistd.h>

// 在进程B的代码中调用
pid_t parentPid = getppid();

获取父进程名称

Linux系统通过/proc文件系统暴露进程信息,我们可以读取对应文件来获取父进程名称:

方法1:读取/proc/[父PID]/comm文件

该文件直接存储进程的短名称,用Qt的文件操作即可读取:

#include <QFile>
#include <QString>

QString getParentProcName(pid_t parentPid) {
    QString commFilePath = QString("/proc/%1/comm").arg(parentPid);
    QFile commFile(commFilePath);
    if (commFile.open(QIODevice::ReadOnly | QIODevice::Text)) {
        QString procName = commFile.readAll().trimmed();
        commFile.close();
        return procName;
    }
    return QString(); // 读取失败返回空字符串
}

方法2:读取/proc/[父PID]/status文件

该文件包含更详细的进程状态信息,其中Name:字段对应进程名称,需要解析文件内容提取:

#include <QFile>
#include <QString>
#include <QTextStream>

QString getParentProcNameFromStatus(pid_t parentPid) {
    QString statusFilePath = QString("/proc/%1/status").arg(parentPid);
    QFile statusFile(statusFilePath);
    if (statusFile.open(QIODevice::ReadOnly | QIODevice::Text)) {
        QTextStream stream(&statusFile);
        QString line;
        while (stream.readLineInto(&line)) {
            if (line.startsWith("Name:")) {
                QStringList parts = line.split('\t');
                if (parts.size() >= 2) {
                    statusFile.close();
                    return parts[1].trimmed();
                }
            }
        }
        statusFile.close();
    }
    return QString();
}

注意:如果父进程在进程B读取信息前退出,进程B会被init(或systemd)接管,此时getppid()会返回init的PID。但在你的场景中,父进程PID为1(本身就是init类进程),因此不会出现这种情况。

内容的提问来源于stack exchange,提问作者TSG

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 02:57:13