Quels signaux OS X envoie-t-il pour les commandes Quit et For Quit?

7

Que se passe-t-il en coulisse lorsqu'un utilisateur donne une commande Quitou en Force Quitdehors de l'application cible (par exemple, depuis Activity Monitor)?

Lumière noire brillante
la source

Réponses:

7

En règle générale, l'opération «Quitter» n'est pas un signal. il s'agit d'un événement Apple , qui est le même type de communication inter-processus que celui utilisé pour les scripts AppleScript et pour l'ouverture de fichiers ou d'URL dans des applications déjà en cours d'exécution. Il provient de la lignée Mac OS plutôt que d'Unix.

Un processus doit s'inscrire spécifiquement pour recevoir les événements Apple. Ces processus sont des processus d'interface graphique ou du moins associés à une session de bureau (ce qui, en dehors de Activity Monitor, est la seule façon de se faire ordonner de cesser de fumer).

Toutefois, si vous «quittez» un processus à partir du moniteur d'activité et que ce processus ne s'est pas enregistré pour recevoir les événements Apple, il enverra SIGTERM (15) à la place.

Kevin Reid
la source
6

Vous pouvez utiliser dtrace pour voir quels signaux sont envoyés aux processus:

sudo dtrace -n 'proc:::signal-send /pid/ { printf("%s -%d %d", execname, args[2], args[1]->pr_pid); }'

Si vous forcez la fermeture d'une application affichée dans le Dock, le signal est généralement de -15 (TERM). Mais si vous forcez un processus d'arrière-plan à quitter Activity Monitor, il s'agit généralement de -9 (KILL).

Lri
la source
Intéressant. Comment fait-on la distinction entre les applications et les processus en arrière-plan?
Blacklight Shining
Je ne l'ai pas testé avec autant de processus, mais je voulais dire des processus qui n'ont pas de barre de menus ou qui ne sont pas affichés dans le Dock ou la fenêtre de fermeture forcée.
Lri
1

Vous pouvez afficher les événements de forcer la fermeture pour les applications graphiques envoyées à system.log. Ou utilisez dtrace tel que posté dans ce fil de discussion. Avec dtrace, vous obtenez plus de précision, mais vous avez besoin de privilèges root.

1,61803
la source
-1 (inexact): /var/log/system.logn'enregistre pas les signaux.
Blacklight Shining
1
@BlacklightShining Essayez de lancer TextEdit.app et de le forcer à le quitter via Activity Monitor.app. Vous devriez voir une ligne comme celle-ci. Apr 28 13:04:21 com.apple.launchd.peruser.501[136] ([0x0-0x3e13e1].com.apple.TextEdit[5336]): Exited: Terminated: 15Il n'enregistre cependant pas l'événement Quitter.
1.61803
1
Certes, cela fonctionne pour les applications graphiques. Cependant, si vous démarrez un autre processus et le signalez, il ne sera pas enregistré. Ainsi, vous ne pouvez pas, en général, "voir les signaux envoyés" dans system.log.
Blacklight Shining
1
@BlacklightShining J'ai modifié mon message pour refléter votre commentaire.
1.61803