Je viens de rencontrer un code qui utilise l'appel du système Kill pour envoyer un signal SIGSEGV à une application. La raison d'être derrière cela était que cela obligerait l'application à cycles de base et à cesser de fumer. Cela me semble tellement faux, c'est cette pratique normale? P>
5 Réponses :
oui. Kill code> est un peu surmonté - il peut envoyer n'importe quel signal. Il existe de nombreuses utilisations pour
Kill code> qui n'entraînent pas le processus étant tué du tout! P>
+1: Kill -1 est couramment utilisé pour envoyer Sighup, qui provoque traditionnellement des programmes écrits avec cette fonctionnalité pour recharger leurs configurations. (E.G.: sendmail, init, etc.)
Sigquit étant celui pour obtenir un décharge de base.
Si vous souhaitez effectuer une décharge d'application, il est noyau d'un autre programme, à peu près le seul moyen de le faire est via un signal. SEGV serait bien pour cela. Sinon, vous pouvez accrocher un débogueur jusqu'au programme et le geler et voir ses registres et tels sans le tuer. P>
Si vous souhaitez jeter un noyau d'une application, il existe des moyens plus agréables de le faire, comme via une affirmation (). P>
Donc, non, il n'est pas particulièrement faux d'envoyer un SEGV à un programme. Vous pouvez également envoyer des choses comme Sigill pour une instruction illégale ou une fracture par zéro signal. Tout va bien. P>
Non, ce n'est pas bien. Ces signaux ont tous des significations et des programmes spécifiques qui leur répondent différemment. Ils ne tueront pas tous le programme, ils ne produiront pas tous les vidanges de base.
Le moyen de le faire à Unix / Linux est d'appeler Abort () qui enverra Sigabort au processus actuel. L'autre option est soulevée () où vous pouvez spécifier quel signal que vous souhaitez envoyer au processus en cours. P>
+1 pour relever code> et
Abort code> qui gagnent beaucoup plus de sens lorsque la cible est vous-même.
SIGQUIT est le signal correct à envoyer à un programme si vous souhaitez produire un vidage de base. Remarque, vous ne devez pas envoyer de signaux aléatoires au programme, et tous ne produiront pas un vidage de base. Beaucoup d'entre eux seront traités par le programme lui-même, consommé, ignoré ou induisent une autre transformation. Ainsi, envoyer un SIGSEGV est faux. P>
GCC dit:
http://www.gnu.org/s/libc/manual /html_node/termination-signals.html P>
POSIX / UNIX dit:
http://pubs.opengroup.org/onlinepubs/009695399/basedfs/signal .h.html p> Kill code> est le programme de ligne de commande correct pour envoyer des signaux (il est bien sûr mal nommé, car tous les signaux ne tueront pas le programme). P>
+1 Mais une référence irait un long chemin ici ... Qu'est-ce que POSIX dit réellement sur les décharges de base?
D'accord. Second Doc Marks avec 'A' Signification Abort et peut produire un fichier de base.
Malheureusement, l'application aurait pu installer un gestionnaire de signal pour que Sigquit empêche le comportement par défaut. Dans ce cas, vous n'obtiendrez plus aucun vidage de base. Seriez-vous alors - et seulement à ce moment-là - considérez-le légitime d'essayer d'abuser de l'un des autres signaux par défaut générant une caisse de base (SIGSEGV, SIGILL, ...)?
Richard Stevens (_Avance programmation dans l'environnement UNIX) a écrit: P>
La génération de noyau est une fonctionnalité de mise en œuvre de la plupart des UNIX. Ce n'est pas une partie de POSIX.1. P> blockQuote>
Il répertorie 12 signaux dont l'action par défaut est de se terminer avec un noyau (ANSI: SIGABRT, SIGFPE, SIGILL, SIGSEGV, POSIX: SIGQUIT, SIGEMT, SIGIOT, SIGSYS, SIGTRAP, SIGXCPU, SIGXFSZ), Tous sont écrasables (les deux signaux qui ne sont pas écrasés sont Sigkill et SIGSTOP). P>
Je n'ai jamais vu un moyen de générer un noyau qui n'est pas l'utilisation d'un gestionnaire de signal par défaut. p>
Donc, si votre objectif est de générer un noyau et d'arrêter, le meilleur est de choisir un signal dont le gestionnaire par défaut est le travail (SIGSEGV effectue le travail), réinitialisez le gestionnaire par défaut du signal si vous l'utilisez, puis utilisez-la. Tuez. P>
Emacs a un moyen de générer un noyau sans gestionnaire de signal. Il est utilisé dans le processus de construction du programme pour enregistrer un nouveau binaire EMACS avec l'élisp déjà chargé, et c'est une horrible hack ...
@R .. La dernière fois que j'ai vérifié, Emacs Way était d'écrire un fichier principal tout en ayant la connaissance des formats de fichiers exécutables et principaux.
Oui, c'est ce que ça fait. Xemacs a une approche beaucoup SANTER - il attribue tout le code / données Elisp dans un tas qu'il gère (dans la section .data code>), enregistre que sur le disque, puis à l'exécution utilise
MMAP code> avec
mapper_fixed code> pour cartographier le haut de son "tas".
Jetez un coup d'œil à ceci: unix.stackexchange.com/questions/11185/...