From: Bernhard Rosenkraenzer Date: Sat, 17 Dec 2022 17:34:17 +0800 Subject: Use procps-ng 4.0.0 --- CMakeLists.txt | 2 +- lxqt-session/src/procreaper.cpp | 19 ++++++++++++------- 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index a3c5e0d..45992a0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -35,7 +35,7 @@ find_package(X11 REQUIRED) message(STATUS "Building with Qt${Qt5Core_VERSION}") find_package(PkgConfig REQUIRED) if (CMAKE_SYSTEM_NAME STREQUAL "Linux") - pkg_search_module(PROCPS REQUIRED libprocps) + pkg_search_module(PROCPS REQUIRED libproc2) endif() # Please don't move, must be after lxqt diff --git a/lxqt-session/src/procreaper.cpp b/lxqt-session/src/procreaper.cpp index 2acd030..495267e 100644 --- a/lxqt-session/src/procreaper.cpp +++ b/lxqt-session/src/procreaper.cpp @@ -29,7 +29,7 @@ #include "log.h" #if defined(Q_OS_LINUX) #include -#include +#include #elif defined(Q_OS_FREEBSD) #include #include @@ -109,16 +109,21 @@ void ProcReaper::stop(const std::set & excludedPids) const pid_t my_pid = ::getpid(); std::vector children; #if defined(Q_OS_LINUX) - PROCTAB * proc_dir = ::openproc(PROC_FILLSTAT); - while (proc_t * proc = ::readproc(proc_dir, nullptr)) + struct pids_info *info = NULL; + enum pids_item items[] = { PIDS_ID_PPID, PIDS_ID_TGID }; + enum rel_items { rel_ppid, rel_tgid }; + struct pids_stack *stack; + procps_pids_new(&info, items, 2); + while ((stack = procps_pids_get(info, PIDS_FETCH_TASKS_ONLY))) { - if (proc->ppid == my_pid) + const int ppid = PIDS_VAL(rel_ppid, s_int, stack, info); + if (ppid == my_pid) { - children.push_back(proc->tgid); + const int tgid = PIDS_VAL(rel_tgid, s_int, stack, info); + children.push_back(tgid); } - ::freeproc(proc); } - ::closeproc(proc_dir); + procps_pids_unref(&info); #elif defined(Q_OS_FREEBSD) int cnt = 0; if (kinfo_proc *proc_info = kinfo_getallproc(&cnt))