Identifier les threads du noyau
Je voudrais savoir comment je peux distinguer un noyau de fil en provenance de l'utilisateur-fil pour un processus de scanner, je suis en train de construire. Je vais avoir un moment difficile de trouver une bonne définition des deux types.
J'ai trouvé que le noyau-fils n'ont pas la mémoire de leur propre, donc pas de Vm* les valeurs dans /proc/$pid/état, et qu'une stat sur /proc/$pid/exe ne retourne rien.
Alors, j'ai pensé que je pouvais identifier les threads du noyau si un processus n'a pas de Vm* les valeurs et les pas de numéro d'inœud. J'ai pensé que mal... mon script voit php-cgi processus qui sont identifiés en tant que noyau de processus de temps en temps.
Si constaté que la plupart des personnes accusées à tort identifié les processus sont des zombies qui sont passés d'une seconde plus tard. J'ai donc mis en place une façon simple de vérifier pour voir si le statut est "Z". Si oui, l'ignorer.
Qui m'a sauvé beaucoup de faux positifs, mais encore je reçois des messages à propos de php-cgi noyau de processus.
Quelqu'un peut me dire comment je peux distinguer un noyau de filetage à partir de l'utilisateur, le fil de la bonne façon?
source d'informationauteur HighKing
Vous devez vous connecter pour publier un commentaire.
Il sont quelques différences visibles entre un thread du noyau et l'espace utilisateur thread:
/proc/$pid/cmdline
est vide pour les threads du noyau - c'est la méthode utilisée parps
ettop
de distinguer les threads du noyau.La
/proc/$pid/exe
lien symbolique n'a pas de cible pour les threads du noyau - ce qui est logique, puisqu'ils n'ont pas de correspondant exécutable sur le système de fichiers.Plus précisément, la
readlink()
appel système renvoieENOENT
("No such file or directory"), malgré le fait que le lien lui-même existe, pour désigner le fait que l'exécutable pour que ce processus n'existe pas (et n'a jamais fait).Par conséquent, un moyen fiable de vérifier les threads du noyau doit être d'appeler
readlink()
sur/proc/$pid/exe
et de vérifier son code de retour. Si elle réussit, alors$pid
est un processus utilisateur. Si elle échoue avecENOENT
puis un supplément destat()
sur/proc/$pid/exe
doit distinguer le cas d'un thread du noyau à partir d'un processus qui vient de se terminé./proc/$pid/status
est manquant plusieurs champs pour plus threads du noyau, plus précisément, de quelques domaines liés à la mémoire virtuelle.Comme vous l'avez souligné dans votre propre commentaire ci-dessus, tous les processus des utilisateurs sont des descendants du processus init (pid=1). Threads du noyau ne sont pas les descendants des processus init, depuis init est un processus utilisateur, et les processus utilisateur ne peut pas créer de threads du noyau. Par conséquent, pour vérifier si le processus p est un processus utilisateur et pas un thread du noyau, on a besoin pour fonctionner sur le processus de graphique et d'évaluer si
init dom p
où dom est le Dominator de l'opérateur. Concrètement en Python:Ici est une version qui fonctionne sous bash:
Pour l'utiliser, il ne
C'était la première solution utile pour moi en tout cas, merci pour er0 de la version de python.