Je recommande vivement le livre Advanced Programming in the Unix Environment, 2nd Edition comme guide pour la programmation des systèmes.
fork(2)
génère un nouveau processus; c'est presque entièrement un clone du processus actuel. Mais les différences sont vastes: la valeur de retour de fork(2)
est différente dans le parent et l'enfant, l'enfant a un nouveau pid
, le nouveau ppid
, et tous les filedescriptors ayant leur fanion FD_CLOEXEC
seront fermés dans l'enfant (voir fcntl(2)
pour plus de détails). Il y a d'autres différences, mais c'est un bon début.
Lors de la configuration des gestionnaires de signaux, les choses les plus importantes à garder à l'esprit: Utilisez sigaction(2)
pour installer les gestionnaires de signaux, non signal(3)
. signal(3)
n'est pas fiable et permet de perdre des signaux. Vous ne pouvez pas faire beaucoup. La liste des fonctions autorisées que vous pouvez appeler dans un gestionnaire de signal se trouve dans la page de manuel signal(7)
. L'utilisation de fonctions en dehors de cette liste est dangereuse et peut créer des bogues très difficiles. Vous pouvez également définir des indicateurs dans votre programme qui sont vérifiés par votre boucle d'événement principal, de sorte que vous pouvez quitter ou imprimer correctement l'état ou recharger les fichiers de configuration aux moments appropriés.
donc nous utilisons la fourche pour éviter le crash ou le gel, oui? Et quand nous utilisons la gestion des signaux? Merci – Arash
@arash, 'fork (2)' est le seul mécanisme disponible pour engendrer des processus enfants. Comme le dit @Colin, chaque shell appellera 'fork()' lors du démarrage de nouveaux programmes. Avant que le thread ne soit largement disponible sur les plates-formes Unix, 'fork (2)' était le mécanisme principal pour paralléliser les tâches de calcul afin de tirer parti de plusieurs processeurs ou de permettre aux programmeurs d'utiliser des interfaces d'E/S bloquantes plus simples. 'fork()' reste la seule interface pour générer un nouveau programme enfant, dans l'idiome 'fork (2) + exec' commun. (Voir les pages de manuel 'execle (3)' et 'execve (2)' pour plus de détails.) – sarnold
@arash, la gestion du signal est utilisée lorsque vous voulez faire quelque chose de "gentil" quand l'utilisateur tape '^ C' ou veut recharger la configuration avec 'kill $ (pidof ushare) SIGHUP ou des commandes similaires, ou utilisez des opérations d'E/S asynchrones pilotées par' SIGIO' (voir l'indicateur 'O_ASYNC' dans' open (2) 'pour les détails), nettoyez après les enfants morts (voir 'wait4 (2)' et 'wait (2)' manpages), ou veut coordonner très simplement des tâches avec d'autres processus. – sarnold