Impossible de quitter un processus enfant à l’aide de fork

J’utilise le code suivant pour créer un processus enfant, puis le tuer après un certain temps.

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); } 

Le problème est qu’après 10 secondes, le programme s’arrête mais pas le processus youtube-dl. Cela continue toujours. Mon exigence est que je veux démarrer un processus et le tuer après un laps de temps spécifié. Qu’est-ce que je fais exactement mal? Je remarque que le pidof youtube-dl que j’invoque est différent de celui donné à mon processus parent par fork ().

La commande system() désactive un nouveau processus enfant et suspend le processus appelant jusqu’à ce que cet enfant se ferme. Lorsque vous supprimez votre processus enfant, le processus de petit-enfant créé par system() continue de s’exécuter.

Au lieu de system() , utilisez execl() qui remplace le processus en cours par le fichier exécuté (sous le même 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); } 

Lorsque vous utilisez la fonction system , un autre processus est créé, dont le parent est votre processus enfant. Vous pouvez utiliser exec au lieu de system pour que le kill puisse signaler le bon pid.

SI le processus enfant est censé ne faire que le téléchargement youtube (et rien de plus après), vous pourriez simplement:

  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); }