वहाँ एक रास्ता है, सी के साथ लिनक्स में, एक और आवेदन को बंद करने के लिए? [डुप्लिकेट]
मैं एक ऐसा कार्यक्रम बनाना चाहूंगा जो कुछ कार्यक्रमों को खोलने से रोक सकता है, या उन्हें शुरू करने के बाद रोक सकता है। मैं केवल C में कोड कर सकता हूं और GUI जोड़ना भी चाहूंगा, इसलिए मैं बैश और मार का उपयोग नहीं कर सकता। क्या C से किसी अन्य प्रोग्राम को बंद करने का कोई तरीका है?
मैं मूल रूप से एक "समय-देरी" बनाना चाहता हूं, इसलिए मैं स्कूल के दिन के दौरान मिनीक्राफ्ट शुरू नहीं कर सकता।
मैं कोड को यथासंभव कुशल रखना चाहूंगा, और किसी भी उपकरण को एक सेवा की तरह खोजने में सक्षम नहीं हूं, जो कुशलतापूर्वक ऐप को बंद कर देगा या उन्हें पहली जगह में शुरू करने से रोक देगा।
जवाब
इसलिए हम जो करना चाहते हैं वह प्रक्रिया है और 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
लूप में कर सकते हैं , लेकिन उस रेगेक्स को लिखना मुश्किल है और मैं इसका पता नहीं लगाना चाहता।