Existe-t-il un moyen, avec C sous Linux, de fermer une autre application? [dupliquer]

Nov 30 2020

Je voudrais créer un programme qui puisse bloquer l'ouverture de certains programmes ou les arrêter après leur démarrage. Je ne peux coder qu'en C et je voudrais également ajouter une interface graphique, donc je ne peux pas utiliser bash and kill. Existe-t-il un moyen de fermer un autre programme à partir de C?

Je veux essentiellement créer un «délai» pour ne pas pouvoir démarrer minecraft pendant la journée d'école.

Je voudrais garder le code aussi efficace que possible et je n'ai pas été en mesure de trouver des outils comme un service qui fermerait efficacement les applications ou les empêcherait de démarrer en premier lieu.

Réponses

Joshua Dec 01 2020 at 03:56

Donc, ce que nous voulons faire, c'est localiser le processus et kill()lui. Ce n'est pas si difficile. C'est juste très long parce que l'exécutable n'est pas minecraft, c'est javadonc on cherche le .jarfichier.

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

Ouf. Décomposons cela. Cette fonction effectue une itération sur tous les processus en cours d'exécution et lit dans sa ligne de commande. Une fois cela fait, il vérifie la ligne de commande pour le modèle de Minecraft; qui a un argument de ligne de commande de minecraft / versions / something / something.jar. En java, les arguments jar sont regroupés ensemble séparés par des :caractères, donc il gère cela. En obtenant un match, il appelle kill.

La planification de cette fonction reste un exercice pour le lecteur. Voir time()et sleep()fonctions. Quant à l'exécuter, la manière paresseuse est de lui coller un appel /etc/rc.local.

Vous pouvez le faire pkill -fen boucle, mais cette expression régulière est difficile à écrire et je ne veux pas la comprendre.