No se puede salir de un proceso hijo utilizando el tenedor

Estoy usando el siguiente código para crear un proceso hijo y luego lo mato después de un tiempo.

int pid; if ((pid = fork()) < 0) { printf("Error\n"); } else if (pid == 0) { printf("Child\n"); system("/usr/bin/./youtube-dl -o hello.mp4 http://www.youtube.com/watch?v=PDZcqBgCS74", NULL); } else { printf("Father\n"); //system("ls"); printf("PId is %d",pid); sleep(10); kill(pid, SIGTERM); } 

El problema es que después de 10 segundos, el progtwig se detiene pero el proceso youtube-dl no lo hace. Todavía sigue continuando. Mi requisito es que quiero iniciar un proceso y eliminarlo después de un período de tiempo específico. ¿Qué es exactamente lo que estoy haciendo mal? Observo que el pidof youtube-dl que estoy invocando es diferente del que se da a mi proceso padre de fork ().

El comando system() desactiva un nuevo proceso hijo y suspende el proceso de llamada hasta que ese hijo se cierra. Cuando mata el proceso hijo, el proceso de nieto creado por system() continúa ejecutándose.

En lugar de system() , use execl() que reemplaza el proceso actual con el archivo ejecutado (bajo el mismo PID):

 else if (pid == 0) { execl("/usr/bin/./youtube-dl", "/usr/bin/./youtube-dl", "-o", "hello.mp4", "http://www.youtube.com/watch?v=PDZcqBgCS74", NULL); /* only reached if execl() fails */ perror("execl"); _exit(1); } 

Cuando utiliza la función del system , se crea otro proceso, cuyo principal es el proceso secundario. Puedes usar exec lugar de un system para que la kill pueda señalar el pid correcto.

Si se supone que el proceso hijo solo realiza la descarga de youtube (y nada más después), usted podría simplemente:

  else if (pid == 0) { /* chld process */ execl("/usr/bin/youtube-dl", "youtube-dl", "-o", "hello.mp4", "http://www.youtube.com/watch?v=PDZcqBgCS74", NULL); perror ("youtube-dl exec failed"); _exit(126); }