¿Hay alguna forma, con C en linux, de cerrar otra aplicación? [duplicar]
Me gustaría crear un programa que pueda bloquear la apertura de algunos programas o detenerlos después de que hayan comenzado. Solo puedo codificar en C y también me gustaría agregar una GUI, por lo que no puedo usar bash y kill. ¿Hay alguna forma de cerrar otro programa de C?
Básicamente, quiero crear un "retraso de tiempo" para que no pueda iniciar Minecraft durante el día escolar.
Me gustaría mantener el código lo más eficiente posible, y no he podido encontrar ninguna herramienta como un servicio que cierre las aplicaciones de manera eficiente o las bloquee para que no se inicien en primer lugar.
Respuestas
Entonces, lo que queremos hacer es ubicar el proceso y kill()
eso. No es tan dificil. Es muy largo porque el ejecutable no minecraft
lo es java
, así que buscamos el .jar
archivo.
#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);
}
Uf. Analicemos esto. Esta función itera sobre todos los procesos en ejecución y lee en su línea de comando. Una vez hecho esto, comprueba la línea de comandos para el patrón de Minecraft; eso es tener un argumento de línea de comando de minecraft / versiones / algo / algo.jar. En java, los argumentos jar se agrupan juntos separados por :
caracteres, por lo que maneja eso. Al conseguir una coincidencia, llama kill
.
La programación de esta función se deja como un ejercicio para el lector. Ver time()
y sleep()
funciones. En cuanto a ejecutarlo, la forma perezosa es pegarle una llamada /etc/rc.local
.
Puede hacer esto pkill -f
en un bucle, pero esa expresión regular es difícil de escribir y no quiero resolverlo.