Есть ли способ с помощью C в Linux закрыть другое приложение? [дубликат]

Nov 30 2020

Я хотел бы создать программу, которая могла бы блокировать открытие некоторых программ или останавливать их после их запуска. Я могу кодировать только на C и также хочу добавить графический интерфейс, поэтому я не могу использовать bash и kill. Есть ли способ закрыть другую программу из C?

Я хочу создать «временную задержку», чтобы я не мог запустить майнкрафт в школьный день.

Я хотел бы, чтобы код был как можно более эффективным, и я не смог найти никаких инструментов, таких как служба, которые бы эффективно закрывали приложения или вообще блокировали их запуск.

Ответы

Joshua Dec 01 2020 at 03:56

Итак, мы хотим найти процесс и kill()его. Это не так уж и сложно. Это просто очень долго , потому что исполняемый файл не minecraft, это java, так что мы ищем .jarфайл.

#include <stdlib.h>
#include <dirent.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>

void kill_minecraft()
{
    char buf[8192];
    DIR *dir = opendir("/proc");
    struct dirent *dirent;
    while ((dirent = readdir(dir)))
    {
        pid_t pid = atol(dirent->d_name);
        if (pid > 0)
        {
            sprintf(buf, "/proc/%s/cmdline", dirent->d_name);
            FILE *in = fopen(buf, "r");
            if (in)
            {
                size_t nmem = fread(buf, 1, 8192, in);
                fclose(in);
                buf[8192] = 0;
                // Recognize minecraft's jar in the command line
                if (nmem > 0 && (char *ptr = (char*)memmem(buf, "minecraft/versions/", nmem)))
                {
                     char *p1 = (char*)strstr(ptr, ":");
                     char *p2 = (char*)strstr(ptr, ".jar");
                     if (p2 && (!p1 || p1 > p2))
                     {
                         // Match! Goodbye!
                         kill(pid, 9);
                     }
                }
                fclose(in);
            }
        }
    }
    closedir(dir);
}

Уф. Давайте разберемся с этим. Эта функция выполняет итерацию по всем запущенным процессам и читает в своей командной строке. После этого он проверяет командную строку на наличие шаблона minecraft; который имеет аргумент командной строки minecraft / versions / something / something / something.jar. В java аргументы jar объединены вместе, разделенные :символами, поэтому он обрабатывает это. При совпадении он звонит kill.

Планирование этой функции оставлено в качестве упражнения для читателя. Смотрите time()и sleep()функции. Что касается его запуска, ленивый способ - это вставить в него вызов /etc/rc.local.

Вы можете сделать это pkill -fв цикле, но это регулярное выражение сложно написать, и я не хочу в этом разбираться.