2011-03-12 3 views
0

im nouveau en C++, je veux savoir quand nous devons utiliser la gestion des signaux dans notre programme? Et j'ai vu dans certains codes qu'ils fourchèrent après la mise en place du signal, qu'est-ce que la fourchette ici?Traitement du signal en C++

TIA

Répondre

4

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.

+0

donc nous utilisons la fourche pour éviter le crash ou le gel, oui? Et quand nous utilisons la gestion des signaux? Merci – Arash

+1

@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

+1

@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

1

Fork est une fonction intégrée dans C qui permet au programme de créer une instance enfant de lui-même, qui commence l'exécution au moment où le fork fork a été appelé. Shells fork avant d'exécuter une commande, ce qui est bien parce que si la commande provoque un crash ou un gel, l'instance fourchue du programme peut être tuée tout en gardant le parent en vie.

+2

'fork()' n'est pas une "fonction intégrée dans C". 'fork()' est défini dans les [spécifications posix] (http://pubs.opengroup.org/onlinepubs/009695399/functions/fork.html) (et plus tôt, également sous forme de spécifications unix-centric). 'fork()' n'est pas spécifié dans la [norme C99] (http://www.open-std.org/JTC1/SC22/WG14/www/standards.html#9899) ou tout autre standard C. – sarnold

+0

donc on utilise une fourche pour éviter les crash ou les gel, oui? Et quand on utilise la gestion des signaux? Merci – Arash

Questions connexes