Primeiro, você pode simplificar seu problema cortando um dos processos intermediários: não há motivo para usar sh -c
para iniciar seu processo. Na verdade, é potencialmente menos seguro, se sua linha de comando real for construída dinamicamente. Em vez de:
execl("/bin/sh","sh","-c","sudo nmap -sS -A 192.168.0.1/24",NULL);
Você deve fazer apenas:
execlp("sudo", "sudo", "nmap", "-sS", "-A", "192.168.0.1/24", NULL);
Agora você tem apenas dois processos: o sudo
e o nmap
em si. Você conhece o ID do processo do pai ( sudo
), mas não conhece o ID do processo do filho ( nmap
). Mas isso não importa, porque você pode usar um recurso de sudo
: matar o pai (com SIGTERM
) e ele encaminhará o sinal ao filho para você.
Seu último problema restante não está diretamente relacionado à pergunta que você está fazendo, mas é assim mesmo que você provavelmente não tem permissão para matar qualquer um desses processos! Como sudo
está envolvido, o qual tem como objetivo elevar seu privilégio, você provavelmente não tem permissão para enviá-lo ou a seus sinais filhos em primeiro lugar.