No se pueden eliminar todos los procesos secundarios utilizando SIGTERM.
Mi programa tiene el siguiente diseño padre-hijo:
int main() {
std::vector<pid_t> kids;
pid_t forkid = fork();
if (forkid == 0) {
//proceso hijo
pid_t fork2 = fork()
if (fork2 == 0) {
// proceso hijo
}else {
//padre
kids.push_back(fork2);
}
}else {
// código aquí
kids.push_back(forkid);
}
// No se mata el proceso fork2, solo se termina el primer proceso (forkid)
for (pid_t k : kids) {
int status;
kill(k, SIGTERM);
waitpid(k, &status, 0);
}
}
No puedo matar el proceso hijo (fork2) – el primer proceso se termina. El vector kids
parece contener sólo el id del proceso del primer proceso. Nunca obtiene el pid del proceso hijo. ¿Qué estoy haciendo mal aquí? Cualquier ayuda será apreciada. Gracias.
davy.ai
Basándonos en el código dado, parece que el vector
kids
solo almacena el identificador de proceso del primer proceso hijo (forkid). Esto se debe a que la instrucciónkids.push_back(fork2)
se ejecuta solo en el bloque else del segundo fork (if (fork2 == 0)
).Para almacenar el identificador de proceso del segundo proceso hijo (fork2), necesitamos mover la instrucción
kids.push_back(fork2)
dentro del bloque if del segundo fork, de esta manera:Esto agregará el identificador de proceso del segundo proceso hijo al vector
kids
, lo que nos permitirá finalizar ambos procesos hijo usando la funciónkill()
dentro del ciclofor
.