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

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.


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


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 (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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.