Êtes-vous un étudiant de l'EPFL à la recherche d'un projet de semestre?
Travaillez avec nous sur des projets en science des données et en visualisation, et déployez votre projet sous forme d'application sur Graph Search.
La fonction fork fait partie des appels système standard d'UNIX (norme POSIX). Cette fonction permet à un processus (un programme en cours d'exécution) de donner naissance à un nouveau processus qui est sa copie conforme, par exemple en vue de réaliser un second traitement parallèlement au premier. Un bon moyen de visualiser l'effet d'un fork sur un processus est d'imaginer une division cellulaire. Il existe une filiation dans les processus : le créateur d'un nouveau processus est appelé le père et le nouveau processus, le fils. La plupart des attributs système du père (par exemple les droits sur le système de fichier) sont transmis au fils, de la même manière que l'héritage. Au démarrage d'un système Unix, un seul processus existe (de numéro 1). Tous les autres processus qui peuvent exister au cours de la vie du système descendent de ce premier processus, appelé init, via des appels système comme fork, vfork, posix_spawn ou d'autres moyens. Sur les premiers UNIX, seul l'appel système fork permet de créer de nouveaux processus. L'appel système fork fournit une valeur résultat qui est entière. Pour identifier le père du fils nouvellement créé, il suffit de regarder la valeur de retour du fork(). Celle-ci peut être le PID du fils, auquel cas nous sommes dans le processus père, ou bien 0 auquel cas nous sommes dans le processus fils. Le fork() peut également renvoyer la valeur -1, qui traduit une erreur lors de l’exécution de la commande. Afin d'obtenir le numéro du processus, il suffit de faire l'appel système getpid(), ou getppid() pour obtenir le numéro du père. Il est possible d’interagir entre processus de plusieurs manières différentes. Premièrement, on peut envoyer des signaux. En langage de commande kill permet de tuer le processus ayant pour pid ce que l'on entre dans la commande. Il est possible de faire attendre un processus grâce à sleep(n) pour bloquer le processus pendant n secondes, ou en utilisant pause() qui bloque jusqu'à la réception d'un signal.
Mathias Josef Payer, Zhenyu Wu