13 #ifndef __STOUT_OS_POSIX_KILLTREE_HPP__
14 #define __STOUT_OS_POSIX_KILLTREE_HPP__
32 inline std::set<pid_t>
children(
pid_t,
const std::list<Process>&,
bool);
37 const std::set<pid_t>&,
38 const std::list<Process>&);
62 bool sessions =
false)
72 std::queue<pid_t> queue;
78 foreach (
const Process& _process, processes.
get()) {
79 if (groups && _process.
group == pid) {
80 queue.push(_process.
pid);
81 }
else if (sessions &&
84 queue.push(_process.
pid);
91 return std::list<ProcessTree>();
100 std::set<pid_t> groups;
101 std::set<pid_t> sessions;
109 if (process.
isSome() && (groups || sessions)) {
115 visited.groups.insert(parent.
get().
group);
123 while (!queue.empty()) {
124 pid_t pid = queue.front();
127 if (visited.pids.count(pid) != 0) {
136 }
else if (process.
isNone()) {
145 visited.pids.insert(pid);
146 visited.processes.push_back(process.
get());
164 if (visited.groups.count(group) == 0) {
165 foreach (
const Process& process, processes.
get()) {
166 if (process.
group == group) {
167 queue.push(process.
pid);
170 visited.groups.insert(group);
181 if (visited.sessions.count(session) == 0) {
182 foreach (
const Process& process, processes.
get()) {
184 queue.push(process.
pid);
187 visited.sessions.insert(session);
193 foreach (
pid_t pid, visited.pids) {
216 foreach (
pid_t pid, visited.pids) {
221 return pstrees(visited.pids, visited.processes);
226 #endif // __STOUT_OS_POSIX_KILLTREE_HPP__
bool isNone() const
Definition: result.hpp:112
Definition: errorbase.hpp:35
Definition: option.hpp:28
static Result< T > error(const std::string &message)
Definition: result.hpp:53
const pid_t group
Definition: process.hpp:55
Try< std::list< ProcessTree > > pstrees(const std::set< pid_t > &, const std::list< Process > &)
Definition: pstree.hpp:84
Try< std::list< Process > > processes()
Definition: os.hpp:182
const Option< pid_t > session
Definition: process.hpp:56
Definition: result.hpp:40
bool isSome() const
Definition: option.hpp:115
DWORD pid_t
Definition: windows.hpp:187
Definition: process.hpp:32
const pid_t pid
Definition: process.hpp:53
Try< std::list< ProcessTree > > killtree(pid_t pid, int signal, bool groups=false, bool sessions=false)
Definition: killtree.hpp:58
const T & get() const &
Definition: option.hpp:118
const T & get() const
Definition: result.hpp:115
static Try error(const E &e)
Definition: try.hpp:42
int kill(pid_t pid, int sig)
Definition: kill.hpp:21
const pid_t parent
Definition: process.hpp:54
Result< Process > process(pid_t pid)
Definition: freebsd.hpp:30
bool isError() const
Definition: try.hpp:71
std::set< pid_t > children(pid_t, const std::list< Process > &, bool)
Definition: os.hpp:215
bool isSome() const
Definition: result.hpp:111
bool isError() const
Definition: result.hpp:113
Try< std::set< pid_t > > pids()
Definition: freebsd.hpp:62
const T & get() const
Definition: try.hpp:73