// Determine UNIX processes by reading "/proc". Default to ps if // it does not exist static QList<ProcData> unixProcessList() { const QDir procDir(QLatin1String("/proc/")); if (!procDir.exists()) return unixProcessListPS(); QList<ProcData> rc; const QStringList procIds = procDir.entryList(); if (procIds.isEmpty()) return rc; foreach (const QString &procId, procIds) { if (!isUnixProcessId(procId)) continue; QString filename = QLatin1String("/proc/"); filename += procId; filename += QLatin1String("/stat"); QFile file(filename); if (!file.open(QIODevice::ReadOnly)) continue; // process may have exited const QStringList data = QString::fromLocal8Bit(file.readAll()).split(' '); ProcData proc; proc.ppid = procId; proc.name = data.at(1); if (proc.name.startsWith(QLatin1Char('(')) && proc.name.endsWith(QLatin1Char(')'))) { proc.name.truncate(proc.name.size() - 1); proc.name.remove(0, 1); } proc.state = data.at(2); // PPID is element 3 rc.push_back(proc); } return rc; }
// Determine UNIX processes by reading "/proc". Default to ps if // it does not exist ProcDataList processList(const ProcDataList& previous) { const QDir procDir(QLatin1String("/proc/")); if (!procDir.exists()) return unixProcessListPS(previous); ProcDataList rc; const QStringList procIds = procDir.entryList(); if (procIds.isEmpty()) return rc; foreach (const QString &procId, procIds) { if (!isUnixProcessId(procId)) continue; QString filename = QLatin1String("/proc/"); filename += procId; filename += QLatin1String("/stat"); QFile file(filename); if (!file.open(QIODevice::ReadOnly)) continue; // process may have exited const QStringList data = QString::fromLocal8Bit(file.readAll()).split(' '); ProcData proc; proc.ppid = procId; proc.name = data.at(1); if (proc.name.startsWith(QLatin1Char('(')) && proc.name.endsWith(QLatin1Char(')'))) { proc.name.truncate(proc.name.size() - 1); proc.name.remove(0, 1); } proc.state = data.at(2); // PPID is element 3 proc.user = QFileInfo(file).owner(); file.close(); QFile cmdFile(QLatin1String("/proc/") + procId + QLatin1String("/cmdline")); if(cmdFile.open(QFile::ReadOnly)) { QByteArray cmd = cmdFile.readAll(); cmd.replace('\0', ' '); if ( !cmd.isEmpty() ) proc.name = QString::fromLocal8Bit(cmd); } cmdFile.close(); QFile maps(QLatin1String("/proc/") + procId + QLatin1String("/maps")); if (!maps.open(QIODevice::ReadOnly)) continue; // process may have exited proc.type = ProcData::NoQtApp; forever { const QByteArray line = maps.readLine(); if (line.isEmpty()) { break; } if (line.contains(QByteArray("/libQtCore.so"))) { proc.type = ProcData::QtApp; break; } } rc.push_back(proc); } return rc; }