LinuxのCで、別のアプリケーションを閉じる方法はありますか?[複製]

Nov 30 2020

一部のプログラムの起動をブロックしたり、起動後に停止したりできるプログラムを作りたいと思います。Cでしかコーディングできず、GUIも追加したいので、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.jarのコマンドライン引数を持っています。Javaでは、jar引数は:文字で区切られてまとめられているため、それを処理します。一致する場合は、を呼び出しますkill

この機能のスケジューリングは、読者の練習問題として残されています。time()sleep()機能を参照してください。それを実行することに関しては、怠惰な方法はそれに呼び出しを貼り付けること/etc/rc.localです。

これpkill -fはループで行うことができますが、その正規表現を書くのは難しく、私はそれを理解したくありません。