diff --git a/dconfig-center/dde-dconfig-daemon/dconfig_global.h b/dconfig-center/dde-dconfig-daemon/dconfig_global.h index 5fabc36..f2423a3 100644 --- a/dconfig-center/dde-dconfig-daemon/dconfig_global.h +++ b/dconfig-center/dde-dconfig-daemon/dconfig_global.h @@ -7,6 +7,7 @@ #include #include #include +#include #include #include #include @@ -178,12 +179,21 @@ class ObjectPool inline QString getProcessNameByPid(const uint pid) { #ifdef Q_OS_LINUX - const QString desc = QString("/proc/%1/cmdline").arg(pid); - - QFile file(desc); - if(file.open(QIODevice::ReadOnly)) { + // Prefer /proc/{pid}/exe symlink for process name. + // May fail due to permission (daemon runs as deepin-daemon, target process + // may belong to another user). Fallback to /proc/{pid}/cmdline in that case. + const QString exePath = QFile::symLinkTarget(QString("/proc/%1/exe").arg(pid)); + if (!exePath.isEmpty()) + return exePath; + + // Fallback: /proc/{pid}/cmdline is world-readable (0444) + const QString cmdlinePath = QString("/proc/%1/cmdline").arg(pid); + QFile file(cmdlinePath); + if (file.open(QIODevice::ReadOnly)) { const QByteArray &name = file.readLine(); - return name.split('\0').join(" ").trimmed(); + const QString cmd = name.split('\0').join(" ").trimmed(); + if (!cmd.isEmpty()) + return cmd; } #endif // Q_OS_LINUX return QString::number(pid); diff --git a/dconfig-center/dde-dconfig-daemon/dconfigconn.cpp b/dconfig-center/dde-dconfig-daemon/dconfigconn.cpp index aca083c..bacf7df 100644 --- a/dconfig-center/dde-dconfig-daemon/dconfigconn.cpp +++ b/dconfig-center/dde-dconfig-daemon/dconfigconn.cpp @@ -240,15 +240,15 @@ int DSGConfigConn::flags(const QString &key) QString DSGConfigConn::getAppid() const { - if (m_appName.isEmpty()) { - if (calledFromDBus()) { - const QString &service = message().service(); + if (calledFromDBus()) { + const QString &service = message().service(); + if (m_lastService != service) { + const_cast(this)->m_lastService = service; const_cast(this)->m_appName = getProcessNameByPid(connection().interface()->servicePid(service)); - } else { - const_cast(this)->m_appName = QString("testappid"); } + return m_appName; } - return m_appName; + return QString("testappid"); } bool DSGConfigConn::contains(const QString &key) diff --git a/dconfig-center/dde-dconfig-daemon/dconfigconn.h b/dconfig-center/dde-dconfig-daemon/dconfigconn.h index aa56248..67d12a6 100644 --- a/dconfig-center/dde-dconfig-daemon/dconfigconn.h +++ b/dconfig-center/dde-dconfig-daemon/dconfigconn.h @@ -72,5 +72,5 @@ public Q_SLOTS: // METHODS ConnKey m_key; DSGConfigResource *m_resource = nullptr; QString m_appName; + QString m_lastService; }; -