Qual a maneira mais eficiente de se matar um processo externo a partir de um programa escrito em C?

1. Qual a maneira mais eficiente de se matar um processo externo a partir de um programa escrito em C?

Osmund Saddler
Saddler

(usa Outra)

Enviado em 04/07/2019 - 12:03h

A minha versão:



//test.c (04/07/2019)

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/types.h>

void stop_attack(pid_t child){

int wstatus;

system("killall xerxes");

if(kill(child, SIGTERM)!=0){

kill(child, SIGKILL);
}

wait(&wstatus);
}

int main(void){

const time_t timer=3600;

pid_t child=fork();

if(child<0){

exit(EXIT_FAILURE);

}else if(child==0){

for(time_t i=0; i<=timer; i++){

usleep(1000000);
}

stop_attack(child);

}else{

system("./xerxes 127.0.0.1 80");
}

return EXIT_SUCCESS;
}



xerxes.c > https://github.com/zanyarjamal/xerxes/blob/master/xerxes.c

No caso acima eu utilizei uma chamada do sistema (system("killall xerxes")), porém não tenho certeza se essa é uma abordagem eficiente e segura, pois podem ocorrer situações onde isso pode falhar.

Existe uma maneira mais eficiente e segura de se matar um processo externo via programa escrito em C, sem que haja a necessidade de uso da função system()?


  


2. Re: Qual a maneira mais eficiente de se matar um processo externo a partir de um programa escrito em C?

Paulo
paulo1205

(usa Ubuntu)

Enviado em 04/07/2019 - 13:17h

kill(pid, sinal); 


Como descobrir o(s) pid(s) que você vai usar é outra questão. Se forem filhos diretos do seu processo, você pode guardá-lo(s) numa variável ou num array no momento da criação desse(s) filho(s). Se não forem, você pode examinar diretamente o conteúdo de /proc/pid/exe e ver se corresponde ao programa que você quer matar.


... “Principium sapientiae timor Domini, et scientia sanctorum prudentia.” (Proverbia 9:10)


3. Re: Qual a maneira mais eficiente de se matar um processo externo a partir de um programa escrito em

Osmund Saddler
Saddler

(usa Outra)

Enviado em 07/07/2019 - 17:29h

paulo1205 escreveu:
Como descobrir o(s) pid(s) que você vai usar é outra questão. Se forem filhos diretos do seu processo, você pode guardá-lo(s) numa variável ou num array no momento da criação desse(s) filho(s). Se não forem, você pode examinar diretamente o conteúdo de /proc/pid/exe e ver se corresponde ao programa que você quer matar.


/proc/8455/exe

O conteúdo de exe é ilegível (está em binário) *_*




4. Re: Qual a maneira mais eficiente de se matar um processo externo a partir de um programa escrito em C?

Paulo
paulo1205

(usa Ubuntu)

Enviado em 07/07/2019 - 23:00h

Realmente, eu falei algo errado. Não é o conteúdo propriamente, mas sim o caminho para o qual o link simbólico aponta.

ls -l /proc/$$/exe
lrwxrwxrwx 1 myuser mygroup 0 Jul 7 22:56 /proc/30936/exe -> /bin/bash


Num programa em C, você pode descobrir o caminho apontado com readlink().


... “Principium sapientiae timor Domini, et scientia sanctorum prudentia.” (Proverbia 9:10)


5. Re: Qual a maneira mais eficiente de se matar um processo externo a partir de um programa escrito em

Osmund Saddler
Saddler

(usa Outra)

Enviado em 14/07/2019 - 08:34h

https://pt.stackoverflow.com/questions/395247/qual-a-maneira-mais-eficiente-de-se-matar-um-processo-...

"Falar é fácil, me mostre o código." - Linus Torvalds

[RESOLVIDO]



6. Re: Qual a maneira mais eficiente de se matar um processo externo a partir de um programa escrito em

Paulo
paulo1205

(usa Ubuntu)

Enviado em 15/07/2019 - 15:50h

Por que eu não gosto de usar /proc/pid/cmdline, e sugeri /proc/pid/exe:

  • porque qualquer programa pode alterar o conteúdo que vai ser apresentado em /proc/pid/cmdline;

  • mesmo que o processo remova ou renomeie o executável original, você ainda consegue rastrear qual programa foi usado nessa execução através do /proc/pid/exe;

  • é mais fácil interpretar o resultado do readlink() associado ao /proc/pid/exe do que o conteúdo de /proc/pid/cmdline.


... “Principium sapientiae timor Domini, et scientia sanctorum prudentia.” (Proverbia 9:10)