Apakah ada cara, dengan C di linux, untuk menutup aplikasi lain? [duplikat]
Saya ingin membuat program yang dapat memblokir beberapa program agar tidak dibuka, atau menghentikannya setelah dimulai. Saya hanya dapat membuat kode dalam C dan juga ingin menambahkan GUI, jadi saya tidak dapat menggunakan bash dan kill. Apakah ada cara untuk menutup program lain dari C?
Saya pada dasarnya ingin membuat "waktu tunda" jadi saya tidak bisa memulai minecraft selama hari sekolah.
Saya ingin menyimpan kode seefisien mungkin, dan belum dapat menemukan alat apa pun seperti layanan yang akan menutup aplikasi secara efisien atau memblokirnya agar tidak dimulai.
Jawaban
Jadi yang ingin kami lakukan adalah menemukan proses dan kill()
itu. Tidak terlalu sulit. Hanya saja sangat lama karena eksekusi tidak minecraft
, itu java
, jadi kita mencari .jar
berkas.
#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);
}
Wah. Mari kita uraikan ini. Fungsi ini mengulangi semua proses yang berjalan dan membaca di baris perintahnya. Setelah melakukannya, ia memeriksa baris perintah untuk pola minecraft; yang memiliki argumen baris perintah minecraft / versi / sesuatu / sesuatu.jar. Di java, argumen jar disatukan dipisahkan oleh :
karakter, jadi itu menangani itu. Saat mendapatkan kecocokan, itu panggilan kill
.
Penjadwalan fungsi ini dibiarkan sebagai latihan bagi pembaca. Lihat time()
dan sleep()
fungsinya. Adapun untuk menjalankannya, cara malas adalah dengan terus memanggilnya /etc/rc.local
.
Anda dapat melakukan ini dengan pkill -f
dalam satu lingkaran, tetapi ekspresi reguler itu sulit untuk ditulis dan saya tidak ingin memahaminya.