Czy jest sposób, z C w Linuksie, aby zamknąć inną aplikację? [duplikować]

Nov 30 2020

Chciałbym stworzyć program, który może blokować otwieranie niektórych programów lub zatrzymywać je po uruchomieniu. Mogę kodować tylko w C i chciałbym również dodać GUI, więc nie mogę używać bash i kill. Czy istnieje sposób na zamknięcie innego programu z poziomu C?

Zasadniczo chcę utworzyć „opóźnienie czasowe”, więc nie mogę uruchomić gry Minecraft w ciągu dnia w szkole.

Chciałbym, aby kod był tak wydajny, jak to tylko możliwe, i nie byłem w stanie znaleźć żadnych narzędzi, takich jak usługa, która sprawnie zamyka aplikacje lub blokuje ich uruchomienie w pierwszej kolejności.

Odpowiedzi

Joshua Dec 01 2020 at 03:56

Chcemy więc zlokalizować proces i kill()to. To nie jest takie trudne. Jest po prostu bardzo długi, ponieważ plik wykonywalny nie minecraftjest java, więc szukamy .jarpliku.

#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);
}

Uff. Rozbijmy to. Ta funkcja iteruje po wszystkich uruchomionych procesach i czyta w swoim wierszu poleceń. Po wykonaniu tej czynności sprawdza wiersz poleceń pod kątem wzorca Minecrafta; czyli posiadanie argumentu wiersza poleceń minecraft / wersje / coś / coś.jar. W Javie argumenty jar są łączone razem, oddzielone :znakami, więc obsługuje to. Po otrzymaniu dopasowania dzwoni kill.

Zaplanowanie tej funkcji pozostawiono czytelnikowi jako ćwiczenie. Zobacz time()i sleep()funkcje. Jeśli chodzi o uruchamianie go, leniwy sposób polega na wywołaniu go /etc/rc.local.

Możesz to zrobić pkill -fw pętli, ale to wyrażenie regularne jest trudne do napisania i nie chcę tego rozgryzać.