1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-25 06:47:35 +00:00

Userland: Add pgrep

This commit is contained in:
Aziz Berkay Yesilyurt 2021-07-04 11:49:10 +02:00 committed by Andreas Kling
parent 3bbe86d8ea
commit 11ff3c11f4
2 changed files with 60 additions and 1 deletions

View file

@ -3,7 +3,7 @@ list(APPEND SPECIAL_TARGETS test install)
list(APPEND REQUIRED_TARGETS
arp base64 basename cat chmod chown chroot clear cp cut date dd df dirname dmesg du echo env expr false fgrep
file find grep groups head host hostname id ifconfig kill killall ln ls mkdir mount mv nproc
pidof ping pmap ps readlink realpath reboot rm rmdir seq shutdown sleep sort stat stty su tail test
pgrep pidof ping pmap ps readlink realpath reboot rm rmdir seq shutdown sleep sort stat stty su tail test
touch tr true umount uname uniq uptime w wc which whoami xargs yes
)
list(APPEND RECOMMENDED_TARGETS
@ -80,6 +80,7 @@ target_link_libraries(open LibDesktop)
target_link_libraries(pape LibGUI)
target_link_libraries(passwd LibCrypt)
target_link_libraries(paste LibGUI)
target_link_libraries(pgrep LibRegex)
target_link_libraries(pls LibCrypt)
target_link_libraries(pro LibProtocol)
target_link_libraries(run-tests LibRegex)

View file

@ -0,0 +1,58 @@
/*
* Copyright (c) 2021, Aziz Berkay Yesilyurt <abyesilyurt@gmail.com>
*
* SPDX-License-Identifier: BSD-2-Clause
*/
#include <AK/QuickSort.h>
#include <AK/Vector.h>
#include <LibCore/ArgsParser.h>
#include <LibCore/ProcessStatisticsReader.h>
#include <LibRegex/Regex.h>
int main(int argc, char** argv)
{
if (pledge("stdio rpath", nullptr) < 0) {
perror("pledge");
return 1;
}
bool case_insensitive = false;
bool invert_match = false;
char const* pattern = nullptr;
Core::ArgsParser args_parser;
args_parser.add_option(case_insensitive, "Make matches case-insensitive", nullptr, 'i');
args_parser.add_option(invert_match, "Select non-matching lines", "invert-match", 'v');
args_parser.add_positional_argument(pattern, "Process name to search for", "process-name");
args_parser.parse(argc, argv);
PosixOptions options {};
if (case_insensitive)
options |= PosixFlags::Insensitive;
Regex<PosixExtended> re(pattern, options);
if (re.parser_result.error != Error::NoError) {
return 1;
}
auto processes = Core::ProcessStatisticsReader::get_all();
if (!processes.has_value())
return 1;
Vector<pid_t> matches;
for (auto& it : processes.value()) {
auto result = re.match(it.name, PosixFlags::Global);
if (result.success ^ invert_match) {
matches.append(it.pid);
}
}
quick_sort(matches);
for (auto& match : matches) {
outln("{}", match);
}
return 0;
}