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
相关产品推荐
相关产品推荐

