Ce soir, je mangeais du porc braisé, et la fille à table m'a demandé : est-ce comestible ? Moi : Tu peux le manger si tu penses que tu peux. . . Sujets sans rapport avec le contenu
Qu'est-ce qu'un signal
Un signal est un mécanisme de notification (également appelé interruption logicielle) au processus lorsqu'un événement se produit. Lorsqu'un processus reçoit un signal, le noyau met en pause le code en cours d'exécution par le processus et passe à la fonction de traitement du signal correspondante. Si la fonction de traitement ne s'interrompt pas, une fois la fonction de traitement exécutée, l'exécution continuera là où elle a été interrompue. mettre en œuvre.
Lorsque nous écrivons du code en mode FPM, nous ne rencontrerons pas de problèmes liés au traitement du signal, mais comment certains scripts résidant en mémoire en mode CLI peuvent-ils redémarrer, s'arrêter et effectuer un travail de nettoyage avant quitter ( rompre les liens, supprimer les fichiers temporaires, etc.) ?
Exemple de traitement du signal C
Dans l'image ci-dessus, j'ai enregistré la fonction de traitement SIGINT
pour le signal sigint_handle
, Après avoir capturé le signal, affichez le contenu et quittez. C'est simple et facile à comprendre. Exécutez gcc -o run run.c && ./run
, puis CTRL+C
(le signal SIGINT
sera déclenché), sortez avec succès : 成功捕获到信号2!
, et le programme terminera son exécution directement.
Exemple de traitement du signal PHP
pcntl_signal
est la méthode d'enregistrement du traitement du signal PHP. Les fonctions implémentées ci-dessus sont implémentées en C. fondamentalement la même chose, la différence est que le processus en cours ne se terminera pas et qu'un signinfo
supplémentaire est généré (PHP est écrit en C, pourquoi n'y a-t-il aucune information relative au signal en langage C pour le moment ? Parce que PHP utilise un autre signal sigaction
, ceux qui sont intéressés peuvent se renseigner)
Le traitement du signal de PHP n'appelle pas directement C
C'est à ce moment-là que pcntl est initialisé. 🎜>La fonction de gestionnaire enregistrée sous tickpcntl_signal_dispatch
mettra la fonction de gestionnaire dans la collection de signaux (table de hachage de PHP), et pcntl_signal
sera finalement appelée php_signale4
Effectuer la gestion du signal sous-jacent. sigaction
est appelé, il le fera. demander si s'il y a un signal, le pcntl_signal_dispatch
ci-dessus bloquera le signal, de sorte que ce n'est qu'après avoir exécuté le code clé que nous pourrons déclencher la fonction de traitement du signal pour garantir l'intégrité des données et de la logique du programme. SIG_BLOCK
, l'astuce qu'ils utilisent est de tuer tous les processus PHP, puis d'en créer de nouveaux. . démarrer. En général, il n'y a pas de problème, mais parfois la tâche d'un certain processus peut ne pas être terminée et il serait un peu impoli de l'interrompre directement. En fait, tant que vous envoyez un signal PHP-FPM
au processus maître de PHP, il terminera le traitement de toutes les tâches et redémarrera le processus enfant ~USR2
.
L'image ci-dessus est un exemple que j'ai simplement écrit. Si nous voulons que le processus se termine correctement, il nous suffit d'envoyer le signal. Il convient de noter que les signaux SIGTERM
et SIGKILL
ignoreront le blocage du signal et arrêteront directement le processus. De plus, le signal interrompra le sommeil (SLEEP) si SIGSTOP
n'est pas exécuté, il renverra le reste. secondes. Il y en a. Vous pouvez l'essayer si vous êtes intéressé. sleep