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 / versions / something / something.jar의 명령 줄 인수가 있습니다. Java에서 jar 인수는 :문자로 구분되어 함께 표시 되므로 처리합니다. 일치를 얻으면 kill.

이 기능을 예약하는 것은 독자를위한 연습입니다. 참조 time()sleep()기능. 실행에 관해서는 게으른 방법은 호출을 /etc/rc.local.

pkill -f루프 에서이 작업을 수행 할 수 있지만 해당 정규식은 작성하기 어렵고 알아 내고 싶지 않습니다.