diff --git a/src/lib/util/kprocesslist.cpp b/src/lib/util/kprocesslist.cpp --- a/src/lib/util/kprocesslist.cpp +++ b/src/lib/util/kprocesslist.cpp @@ -30,7 +30,6 @@ #include "kprocesslist.h" #include "kprocesslist_p.h" -#include using namespace KProcessList; @@ -100,17 +99,3 @@ { return d_ptr->user; } - -KProcessInfo KProcessList::processInfo(qint64 pid) -{ - KProcessInfoList processInfoList = KProcessList::processInfoList(); - auto testProcessIterator = std::find_if(processInfoList.begin(), processInfoList.end(), - [pid](const KProcessList::KProcessInfo& info) - { - return info.pid() == pid; - }); - if (testProcessIterator != processInfoList.end()) { - return *testProcessIterator; - } - return KProcessInfo(); -} diff --git a/src/lib/util/kprocesslist_unix.cpp b/src/lib/util/kprocesslist_unix.cpp --- a/src/lib/util/kprocesslist_unix.cpp +++ b/src/lib/util/kprocesslist_unix.cpp @@ -91,70 +91,83 @@ return rc; } +bool getProcessInfo(const QString& procId, KProcessInfo& processInfo) +{ + if (!isUnixProcessId(procId)) + return false; +#ifdef Q_OS_FREEBSD + QString statusFileName(QStringLiteral("/status")); +#else + QString statusFileName(QStringLiteral("/stat")); +#endif + QString filename = QStringLiteral("/proc/"); + filename += procId; + filename += statusFileName; + QFile file(filename); + if (!file.open(QIODevice::ReadOnly)) + return false; // process may have exited + + const QStringList data = QString::fromLocal8Bit(file.readAll()).split(QLatin1Char(' ')); + qint64 pid = procId.toUInt(); + QString name = data.at(1); + if (name.startsWith(QLatin1Char('(')) && name.endsWith(QLatin1Char(')'))) { + name.chop(1); + name.remove(0, 1); + } + // State is element 2 + // PPID is element 3 + QString user = QFileInfo(file).owner(); + file.close(); + + QString command = name; + + QFile cmdFile(QLatin1String("/proc/") + procId + QLatin1String("/cmdline")); + if (cmdFile.open(QFile::ReadOnly)) { + QByteArray cmd = cmdFile.readAll(); + + if (!cmd.isEmpty()) { + // extract non-truncated name from cmdline + int zeroIndex = cmd.indexOf('\0'); + int processNameStart = cmd.lastIndexOf('/', zeroIndex); + if (processNameStart == -1) { + processNameStart = 0; + } else { + processNameStart++; + } + name = QString::fromLocal8Bit(cmd.mid(processNameStart, zeroIndex - processNameStart)); + + cmd.replace('\0', ' '); + command = QString::fromLocal8Bit(cmd).trimmed(); + } + } + cmdFile.close(); + processInfo = KProcessInfo(pid, command, name, user); + return true; +} + } // unnamed namespace // Determine UNIX processes by reading "/proc". Default to ps if // it does not exist KProcessInfoList KProcessList::processInfoList() { const QDir procDir(QStringLiteral("/proc/")); -#ifdef Q_OS_FREEBSD - QString statusFileName(QStringLiteral("/status")); -#else - QString statusFileName(QStringLiteral("/stat")); -#endif if (!procDir.exists()) return unixProcessListPS(); KProcessInfoList rc; const QStringList procIds = procDir.entryList(); - if (procIds.isEmpty()) - return rc; for (const QString &procId : procIds) { - if (!isUnixProcessId(procId)) - continue; - QString filename = QStringLiteral("/proc/"); - filename += procId; - filename += statusFileName; - QFile file(filename); - if (!file.open(QIODevice::ReadOnly)) - continue; // process may have exited - - const QStringList data = QString::fromLocal8Bit(file.readAll()).split(QLatin1Char(' ')); - qint64 pid = procId.toUInt(); - QString name = data.at(1); - if (name.startsWith(QLatin1Char('(')) && name.endsWith(QLatin1Char(')'))) { - name.chop(1); - name.remove(0, 1); + KProcessInfo processInfo; + if (getProcessInfo(procId, processInfo)) { + rc.push_back(processInfo); } - // State is element 2 - // PPID is element 3 - QString user = QFileInfo(file).owner(); - file.close(); - - QString command = name; - - QFile cmdFile(QLatin1String("/proc/") + procId + QLatin1String("/cmdline")); - if (cmdFile.open(QFile::ReadOnly)) { - QByteArray cmd = cmdFile.readAll(); - - if (!cmd.isEmpty()) { - // extract non-truncated name from cmdline - int zeroIndex = cmd.indexOf('\0'); - int processNameStart = cmd.lastIndexOf('/', zeroIndex); - if (processNameStart == -1) { - processNameStart = 0; - } else { - processNameStart++; - } - name = QString::fromLocal8Bit(cmd.mid(processNameStart, zeroIndex - processNameStart)); - - cmd.replace('\0', ' '); - command = QString::fromLocal8Bit(cmd).trimmed(); - } - } - cmdFile.close(); - - rc.push_back(KProcessInfo(pid, command, name, user)); } return rc; } + +KProcessInfo KProcessList::processInfo(qint64 pid) +{ + KProcessInfo processInfo; + getProcessInfo(QString::number(pid), processInfo); + return processInfo; +} diff --git a/src/lib/util/kprocesslist_win.cpp b/src/lib/util/kprocesslist_win.cpp --- a/src/lib/util/kprocesslist_win.cpp +++ b/src/lib/util/kprocesslist_win.cpp @@ -31,6 +31,7 @@ #include "kprocesslist.h" #include +#include // Enable Win API of XP SP1 and later #ifdef Q_OS_WIN @@ -132,3 +133,17 @@ CloseHandle(snapshot); return rc; } + +KProcessInfo KProcessList::processInfo(qint64 pid) +{ + KProcessInfoList processInfoList = KProcessList::processInfoList(); + auto testProcessIterator = std::find_if(processInfoList.begin(), processInfoList.end(), + [pid](const KProcessList::KProcessInfo& info) + { + return info.pid() == pid; + }); + if (testProcessIterator != processInfoList.end()) { + return *testProcessIterator; + } + return KProcessInfo(); +}