वहाँ एक रास्ता है, सी के साथ लिनक्स में, एक और आवेदन को बंद करने के लिए? [डुप्लिकेट]

Nov 30 2020

मैं एक ऐसा कार्यक्रम बनाना चाहूंगा जो कुछ कार्यक्रमों को खोलने से रोक सकता है, या उन्हें शुरू करने के बाद रोक सकता है। मैं केवल C में कोड कर सकता हूं और GUI जोड़ना भी चाहूंगा, इसलिए मैं बैश और मार का उपयोग नहीं कर सकता। क्या 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 / संस्करणों / कुछ / कुछ के एक कमांड लाइन तर्क हो रहा है। जावा में, जार तर्कों को एक साथ :वर्णों द्वारा अलग किया जाता है, इसलिए यह इसे संभालता है। एक मेल मिलने पर, यह कॉल करता है kill

इस फ़ंक्शन को शेड्यूल करना पाठक के लिए एक अभ्यास के रूप में छोड़ दिया जाता है। देखें time()और sleep()कार्य करता है। इसे चलाने के लिए, आलसी तरीका यह है कि इसमें एक कॉल चिपका दिया जाए /etc/rc.local

आप इसे pkill -fलूप में कर सकते हैं , लेकिन उस रेगेक्स को लिखना मुश्किल है और मैं इसका पता नहीं लगाना चाहता।