It accomplishes this by reading the status file in each process's directory in /proc/. The status file contains the name of the process prefixed by "Name:".
#include <sys/types.h>
#include <signal.h>
#include <dirent.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
bool killp(const char* name) {
pid_t p;
size_t i;
char* s = (char*)malloc(264);
char buf[128];
FILE* st;
DIR* d = opendir("/proc");
if (d == NULL) { free(s); return false; }
struct dirent* f;
while ((f = readdir(d)) != NULL) {
if (f->d_name[0] == '.') continue;
for (i = 0; isdigit(f->d_name[i]); i++);
if (i < strlen(f->d_name)) continue;
strcpy(s, "/proc/");
strcat(s, f->d_name);
strcat(s, "/status");
st = fopen(s, "r");
if (st == NULL) { closedir(d); free(s); return false; }
do {
if (fgets(buf, 128, st) == NULL) { fclose(st); closedir(d); free(s); return false; }
} while (strncmp(buf, "Name:", 5));
fclose(st);
for (i = 5; isspace(buf[i]); i++);
*strchr(buf, '\n') = 0;
if (!strcmp(&(buf[i]), name)) {
sscanf(&(s[6]), "%d", &p);
kill(p, SIGKILL);
}
}
closedir(d);
free(s);
return true;
}
int main() {
char s[256];
fputs("Enter name of process(es) to kill: ", stdout);
gets(s);
killp(s);
}


Sign In
Create Account




Back to top









