8
votes

Quelle est la bonne façon de forcer une application à la centière et à cesser de fumer?

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?


1 commentaires

Jetez un coup d'œil à ceci: unix.stackexchange.com/questions/11185/...


5 Réponses :


6
votes

oui. Kill est un peu surmonté - il peut envoyer n'importe quel signal. Il existe de nombreuses utilisations pour Kill qui n'entraînent pas le processus étant tué du tout!


2 commentaires

+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.



3
votes

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.

Si vous souhaitez jeter un noyau d'une application, il existe des moyens plus agréables de le faire, comme via une affirmation ().

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.


1 commentaires

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.



3
votes

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.


1 commentaires

+1 pour relever et Abort qui gagnent beaucoup plus de sens lorsque la cible est vous-même.



11
votes

SIGQUIT est le signal correct à envoyer à un programme si vous souhaitez produire un vidage de base. Kill 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).

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.


GCC dit: http://www.gnu.org/s/libc/manual /html_node/termination-signals.html

POSIX / UNIX dit: http://pubs.opengroup.org/onlinepubs/009695399/basedfs/signal .h.html


3 commentaires

+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, ...)?



1
votes

Richard Stevens (_Avance programmation dans l'environnement UNIX) a écrit:

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.

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).

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.

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.


3 commentaires

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 ), enregistre que sur le disque, puis à l'exécution utilise MMAP avec mapper_fixed pour cartographier le haut de son "tas".