From af561e98fae62a397352d6a979eea555b321571c Mon Sep 17 00:00:00 2001 From: Your Name Date: Sat, 23 Dec 2023 20:47:06 +0300 Subject: [PATCH] add killall --- src/procps/kill/kill.c | 52 ++++++++++++++++++++++++++++++++++++------ 1 file changed, 45 insertions(+), 7 deletions(-) diff --git a/src/procps/kill/kill.c b/src/procps/kill/kill.c index f6ca1e6..5b5eb03 100644 --- a/src/procps/kill/kill.c +++ b/src/procps/kill/kill.c @@ -3,6 +3,7 @@ #include #include #include +#include #include typedef struct { @@ -48,11 +49,21 @@ int parse_sig(char *arg) { return SIGTERM; } +int my_kill(pid_t pid, int signal) { + if (kill(pid, signal)) { + fprintf(stderr, "kill: %d: %s\n", pid, strerror(errno)); + return 1; + } + + return 0; +} + int main(int argc, char **argv) { + unsigned int a_flag = 0; int signal = SIGTERM; int opt; - while ((opt = getopt(argc, argv, "s:l")) != -1) { + while ((opt = getopt(argc, argv, "s:la")) != -1) { switch (opt) { case 'l': for (size_t i = 0; i < sizeof(signals) / sizeof(signals[0]); i++) @@ -64,8 +75,12 @@ int main(int argc, char **argv) { signal = parse_sig(optarg); break; + case 'a': + a_flag = 1; + break; + default: - printf("kill [pid1 pid2...]\n\t[-s SIG] [-l List all signals]\n"); + printf("kill [pid1 pid2...]\n\t[-s SIG] [-l List all signals]\n\t[-a Kill all process]\n"); return 0; } } @@ -74,12 +89,35 @@ int main(int argc, char **argv) { argc -= optind; int ret = 0; - for (int i = 0; i < argc; i++) { - int pid = atoi(argv[i]); - if (kill(pid, signal)) { - fprintf(stderr, "kill: %d: %s\n", pid, strerror(errno)); - ret = 1; + if (a_flag) { + DIR *dp = opendir("/proc"); + if (dp == NULL) { + fprintf(stderr, "kill: /proc: %s\n", strerror(errno)); + return 1; + } + + pid_t my_pid = getpid(); + + struct dirent *ep; + while ((ep = readdir(dp)) != NULL) { + pid_t pid = atoi(ep->d_name); + if (pid == 0 || pid == my_pid) + continue; + + if (my_kill(pid, signal)) + ret = 1; + } + + closedir(dp); + } + + + else { + for (int i = 0; i < argc; i++) { + pid_t pid = atoi(argv[i]); + if (my_kill(pid, signal)) + ret = 1; } }