Je fais un appel système qui boucle tous les processus avec un certain statut (passé au syscall en tant que paramètre) et affiche leur nom, PID, UID et le nom de leurs enfants . Voilà ce que j'ai jusqu'à présent:Appel système qui montre les processus filtrés par leur statut
asmlinkage int sys_procinfo(int state){
struct task_struct *task;
struct task_struct *child_ptr;
struct list_head *list;
for_each_process(task) {
if(task->state == state){
/* print info about the parent */
printk(KERN_INFO "nombre:%s[pid:%d]estado:%ld[uid:%d]\n", task->comm, task->pid, task->state, task->uid);
list_for_each(list, &task->children) {
child_ptr = list_entry(list, struct task_struct, sibling);
/* child_ptr now points to one of current's children */
printk(KERN_INFO "Hijo %s\n", child_ptr->comm);
}
}
}
return 0;
}
Cette affiche tous les processus et leurs enfants du système, en ignorant complètement la condition if (task-> état == état), ce qui est très bizarre pour moi. Je n'ai besoin d'imprimer que les informations des processus qui sont dans l'état 'state' (par exemple TASK_RUNNING = 0, EXIT_ZOMBIE = 32, TASK_WAKING = 256, TASK_INTERRUPTIBLE = 1, etc.). Oh, et je voudrais aussi que le syscall retourne son numéro syscall, mais je l'ai défini pour deux systèmes: 32 et 64bits, et leurs nombres dans les tables syscall_32.tbl et syscall_64.tbl sont différents, donc je pense Je ne peux pas coder en dur le numéro de syscall. Existe-t-il une macro que je peux utiliser pour renvoyer cette valeur?
Merci. PS: Je travaille sur kubuntu 16.04LTS, et j'utilise le noyau "linux-3.16.43.tar.xz" à partir des archives du noyau Linux
Veuillez fournir plus d'informations pour rendre votre problème reproductible. Je ne suis plus un gourou Linux (même pas un programmeur Linux) mais (avec l'aide de google) je pourrais être en mesure de fournir une réponse (comme je l'ai déjà fait dans le passé). Un [exemple minimal, complet et vérifiable] (http://stackoverflow.com/help/mcve) fournirait l'en-tête nécessaire qui me conduirait aux bonnes pages de manuel. 'for_each_process()' et 'list_for_each()' peuvent être des macros qui sont définies dans votre code non-présenté ou incluses ailleurs. Cela semble intéressant, mais il manque trop de réponses ... – Scheff
Eh bien, c'est en fait le code, et c'est dans le fichier sys.c du noyau. Ces macros sont dans le noyau, je ne les ai pas définies. Quoi qu'il en soit, j'ai trouvé la réponse et je l'afficherai. – Sebasuraa