Comment puis-unix signaux travail?
Comment les signaux de travail sous unix? Je suis passé par W. R. Stevens, mais a été incapable de comprendre. S'il vous plaît aider moi.
Vous devez vous connecter pour publier un commentaire.
Comment les signaux de travail sous unix? Je suis passé par W. R. Stevens, mais a été incapable de comprendre. S'il vous plaît aider moi.
Vous devez vous connecter pour publier un commentaire.
L'explication ci-dessous n'est pas exact, et plusieurs aspects de la façon dont cela fonctionne diffèrent entre différents systèmes (et peut-être même le même système d'exploitation sur un matériel différent pour certaines parties), mais je pense qu'il est généralement bonne assez pour vous de satisfaire votre curiosité assez pour les utiliser. La plupart des gens commencent à l'aide des signaux dans la programmation sans même ce niveau de compréhension, mais avant que je sois à l'aise de les utiliser, je voulais comprendre.
signal de livraison
Le noyau de système d'exploitation dispose d'une structure de données appelée de processus de bloc de contrôle pour chaque processus en cours d'exécution qui a les données relatives à ce processus. Ceci peut être regardé par l'id de processus (PID) et inclus un tableau de signal d'actions et dans l'attente de signaux.
Lorsqu'un signal est envoyé à un processus du noyau de système d'exploitation va chercher les processus de processus de bloc de contrôle et examine le signal de l'action de la table de localiser l'action pour le signal envoyé. Si le signal de valeur de l'action est
SIG_IGN
puis le nouveau signal est oublié par le noyau. Si le signal de valeur de l'action estSIG_DFL
alors le noyau de recherche par défaut de traitement de signal d'action pour ce signal dans une autre table et des préformes de cette action. Si les valeurs sont rien d'autre alors que c'est supposé être une fonction de l'adresse dans le processus, le signal est envoyé à ce qui doit être appelé. Les valeurs deSIG_IGN
etSIG_DFL
sont des nombres exprimés à des pointeurs de fonction dont les valeurs ne sont pas les adresses valides à l'intérieur d'un espace d'adressage du processus (tels que 0 et 1, qui sont à la fois dans la page 0, ce qui n'est jamais mappé dans un processus).Si un signal fonction de gestion ont été enregistrés par le processus (le signal de valeur de l'action était ni SIG_IGN ou SIG_DFL) puis une entrée dans l'attente du signal de table est fait pour que le signal et que le processus est marqué comme prêt à fonctionner (il peut avoir été en attente sur quelque chose, comme les données disponibles pour un appel à
read
, en attente d'un signal, ou de plusieurs autres choses).Maintenant la prochaine fois que le processus est exécuté le noyau de système d'exploitation sera d'abord ajouter des données dans la pile et modifie le pointeur d'instruction pour que le processus, de sorte qu'il semble presque comme si le processus lui-même a juste appelé le gestionnaire de signal. Ce n'est pas tout à fait correcte et la réalité s'écarte assez de ce qui se passe réellement que je vais en parler plus en un peu.
Le gestionnaire de signal fonction peut faire ce qu'il fait (c'est une partie du processus qu'il a été appelé au nom de, de sorte qu'il a été écrit avec des connaissances sur ce que le programme doit faire avec ce signal). Lorsque le gestionnaire de signal renvoie ensuite le code standard pour le processus commence à exécuter de nouveau. (encore une fois, pas précis, mais plus sur que la prochaine)
Ok, le ci-dessus devrait vous donner une assez bonne idée de la façon dont les signaux sont livrés à un processus. Je pense que ce assez bonne idée version est nécessaire avant de pouvoir saisir toute l'idée, qui comprend plus de choses compliquées.
Très souvent le noyau de système d'exploitation a besoin de savoir quand un gestionnaire de signal retourne. C'est parce que les gestionnaires de signaux prendre un argument (ce qui peut nécessiter d'espace de pile), vous pouvez bloquer le même signal de remis deux fois au cours de l'exécution du gestionnaire de signal, et/ou ont des appels système redémarré après qu'un signal est délivré. Pour accomplir ceci, un peu plus de pile et le pointeur d'instruction des changements.
Ce qui doit arriver, c'est que le noyau a besoin pour rendre le processus de dire qu'il a fini de s'exécuter le gestionnaire de signal fonction. Cela peut être fait par une cartographie de la section de la mémoire vive en l'espace d'adressage du processus qui contient le code pour faire cet appel système et de faire de l'adresse de retour pour le gestionnaire de signal fonction (la valeur supérieure de la pile lorsque cette fonction a commencé en cours d'exécution) l'adresse de ce code. Je pense que c'est la façon dont c'est fait dans Linux (au moins les versions plus récentes). Une autre façon d'accomplir ceci (je ne sais pas si cela se fait, mais il pourrait l'être, voulez être ne font de l'adresse de retour pour le gestionnaire de signal fonction d'une adresse non valide (comme NULL) qui pourrait entraîner une interruption sur la plupart des systèmes, ce qui donnerait le noyau de système d'exploitation de nouveau le contrôle. Il n'importe pas beaucoup comment cela se passe, mais le noyau a à obtenir le contrôle de nouveau pour fixer vers le haut de la pile et de savoir que le gestionnaire de signal est terminé.
TOUT EN REGARDANT DANS UNE AUTRE QUESTION, J'AI APPRIS
que le noyau Linux ne carte d'une page dans le processus, mais que l'appel système pour l'enregistrement des gestionnaires de signaux (ce qui sigaction appels ) prend un paramètre sa_restore paramètre, qui est une adresse qui doit être utilisée comme adresse de retour à partir du gestionnaire de signal, et le noyau juste fait en sorte qu'il y est mis. Le code à cette adresse les questions de la je suis fait appel système (
sigreturn
)et le noyau sait que le gestionnaire de signal est terminé.de génération de signal de
Je suis la plupart du temps en supposant que vous savez comment les signaux sont générés dans la première place. Le système d'exploitation peut générer, pour le compte d'un processus qui doit se passer quelque chose, comme une minuterie expire, un processus enfant en train de mourir, l'accès à la mémoire qu'il ne faut pas l'accès ou l'émission d'une instruction qu'il ne devrait pas (soit une instruction qui n'existe pas ou qui est privilégié), ou bien d'autres choses. La minuterie cas est fonctionnellement un peu différent des autres, car il peut se produire lorsque le processus n'est pas en cours d'exécution, et est donc plus, comme les signaux envoyés avec le
kill
appel système. Pour les non-minuterie de signaux envoyés sur le compte de l'actuel processus celles-ci sont générées lorsqu'une interruption se produit parce que le processus actuel est en train de faire quelque chose de mal. Cette interruption donne le noyau de contrôle (comme un système d'appel) et le noyau génère le signal pour être livrés à la processus actuel.strace
, la lecture du code, et, finalement, écrire un programme qui est retourné à partir d'un signal qui n'a jamais été envoyée.Penser le signal facilité d'interruptions, mis en œuvre par le système d'exploitation (au lieu de matériel).
Que votre programme gaiement traverse son lieu d'exécution enracinée dans main(), ces interruptions peuvent se produire, provoquer le programme à être distribué à un vecteur (gestionnaire), exécutez le code, et ensuite retourner à l'endroit où il s'est interrompu.
Ces interruptions (signaux) peuvent provenir d'une variété de sources, par exemple, erreurs matérielles comme un accès de mauvaise ou mal alignées adresses, la mort d'un enfant, l'utilisateur signaux générés à l'aide de la
kill
de commande, ou à partir d'autres processus à l'aide de lakill
appel système. La façon dont vous consommez des signaux est par la désignation des gestionnaires pour eux, qui sont envoyés par le système d'exploitation lorsque les signaux se produisent. Notez que certains de ces signaux ne peuvent pas être traitées, et le résultat dans le processus est tout simplement en train de mourir.Mais ceux qui peuvent être manipulés, peut être très utile. Vous pouvez les utiliser pour la communication interprocessus c'est à dire un processus envoie un signal à un autre processus, qui les manipule, et dans le gestionnaire fait quelque chose d'utile. De nombreux démons vont faire des choses utiles, comme de relire le fichier de configuration si vous envoyer le bon signal.
Certaines questions qui ne sont pas abordées dans toutes les déclarations ci-dessus sont multi core, la course dans l'espace du noyau lors de la réception d'un signal, de dormir dans l'espace du noyau lors de la réception d'un signal, l'appel système redémarrage et gestionnaire de signal de temps de latence.
Ici sont un couple de questions à prendre en considération:
Réponses:
siginterrupt(2)
appel système. Vous pouvez décider si vous voulez que les appels système redémarrage d'un certain signal lorsque vous vous enregistrez le signal à l'aidesigaction(2)
avec leSA_RESTART
drapeau. Si un système d'appel est lancé et est coupé par un signal et ne redémarre pas automatiquement, vous obtiendrez unEINTR
(interrompu) valeur de retour et vous devez gérer cette valeur. Vous pouvez également regarder larestart_syscall(2)
appel système pour plus de détails.Quelques notes sur le pourquoi de tout cela est complexe:
kill(2)
syscall et plus).Alors, quel est le temps de latence de traitement de signal?
Signal ne sont rien, mais une interruption dans l'exécution du processus. Un processus peut envoyer un signal lui-même ou il peut provoquer un signal à transmettre à un autre processus. Peut-être un parent peut envoyer un signal à son enfant afin de le supprimer, etc..
Consulter le lien suivant pour comprendre.
https://unix.stackexchange.com/questions/80044/how-signals-work-internally
http://www.linuxjournal.com/article/3985
http://www.linuxprogrammingblog.com/all-about-linux-signals?page=show