Les signaux SIGKILL et SIGSTOP ne peuvent pas être interceptés, bloqués ou conçus, pourquoi?

Je veux savoir pourquoi ces deux signaux ne peuvent pas être interceptés, bloqués ou ignorés dans un processus? L’action du signal restant peut être modifiée à l’aide de signal (). Quelle est la différence entre ces deux signaux et le signal restant?

Si vous parlez de la raison pour laquelle ils sont bloqués, les raisons sont déjà mentionnées par @Adam B ..Cependant, je voudrais montrer une structure interne. Ce n’est pas que vous ne pouvez pas vraiment bloquer ces deux signaux. Seul KERNEL a la capacité de le faire, pas nous.

Dans l’implémentation de signal.h , vous pouvez voir qu’il y a une ligne comme celle-ci

#define SIG_KERNEL_ONLY_MASK (rt_sigmask(SIGKILL) | rt_sigmask(SIGSTOP))

Cela montre que ces deux signaux ne peuvent être masqués que par le kernel .

Une autre macro est enroulée autour

#define sig_kernel_only(sig) (((sig) < SIGRTMIN) && siginmask(sig, SIG_KERNEL_ONLY_MASK))

qui est utilisé plus tard dans signal.c ..

une fonction appelée do_sigaction renvoie EINVAL lorsqu'elle reçoit un signal ayant une valeur négative ou des signaux qui ne doivent pas être traités autrement que par le kernel.

Regarde ça

 if (!valid_signal(sig) || sig < 1 || (act && sig_kernel_only(sig))) return -EINVAL; 

Il est évident que le système est plus complexe que nous ne le pensons, mais ceci n’est qu’un aperçu pour montrer que seul KERNEL est autorisé à gérer ces signaux. Pas nous. Autre que cela, il n'y a rien de magique dans la mise en œuvre de la fonction.

@R Sahu a également parlé d'un aspect très important de cela. Les utilisateurs root doivent également être limités à certaines opérations pouvant être préjudiciables au système. De plus, certaines applications non conformes ou erronées peuvent être interrompues lorsque vous n'avez pas le choix ni les options pour le tuer. Utilisez SIGKILL ou SIGSTOP avec prudence ... car la plupart du temps, elles ne gèrent pas bien le nettoyage de la mémoire et d'autres tâches de maintenance ... utilisez ces deux seulement quand vous n'avez pas d'autres options..SIGTERM est plus populaire ici

Celles-ci sont gérées par le kernel. Ils sont utilisés pour supprimer des tâches (applications) qui ne répondent pas.

Lorsque votre application ne répond pas elle-même, il devrait y avoir un moyen de quitter l’application. Étant donné que votre tâche ne peut rien gérer à cet état, il doit y avoir un moyen d’envoyer un signal à la tâche qui ne répond pas, mais qui n’est pas traité par la tâche qui ne répond pas.

SIGKILL et SIGSTOP sont utilisés pour ce processus.

C’est pourquoi la page de manuel dit

“Les signaux SIGKILL et SIGSTOP ne peuvent pas être capturés, bloqués ou ignorés.”

Celles-ci sont gérées par le kernel pour vous. Il existe un grand nombre de signaux / signaux en temps réel que vous pouvez utiliser pour vos besoins spécifiques.