2017-09-25 2 views
0

Supposons que j'écris un appel système pour la version 2.6.9 du noyau Linux et que le comportement de mon appel change en fonction d'un paramètre dans le système de fichiers /proc. Si j'ai déjà créé une entrée dans /proc/sys/kernel qui peut être lue et écrite dans l'espace utilisateur via la norme cat et echo, comment puis-je lire la valeur du paramètre de mon appel système?Modifier le comportement des appels système via/proc?

Modifier
Il a été suggéré que la question est double. Je travaille depuis l'intérieur du noyau, donc je n'ai pas accès aux bibliothèques utilisateur standard. En outre, je n'essaie pas de lire la sortie d'un autre processus, j'essaie de lire la valeur définie dans /proc/sys/kernel/myfoobar

+0

Possible copie de [Comment puis-je exécuter un programme externe à partir de C et analyser sa sortie?] (Https://stackoverflow.com/questions/43116/how-can-i-run-an-external-program-from -c-and-parse-its-output) – jack

+0

Je pense que c'est votre question, simplifiée. – jack

+0

> Je veux que le comportement de mon appel change en fonction d'un paramètre dans le système de fichiers/proc Je travaille depuis l'intérieur du noyau myaut

Répondre

0

À partir de l'appel système, j'ai lu /proc/sys/kernel/myfoobar en tant que fichier en utilisant une version modifiée du code de l'article de Greg Kroah-Hartman Driving Me Nuts - Things You Never Should Do in the Kernel:

#include <linux/kernel.h> 
#include <linux/init.h> 
#include <linux/module.h> 
#include <linux/syscalls.h> 
#include <linux/fcntl.h> 
#include <asm/uaccess.h> 

static void read_file(char *filename) 
{ 
    int fd; 
    char buf[1]; 

    mm_segment_t old_fs = get_fs(); 
    set_fs(KERNEL_DS); 

    fd = sys_open(filename, O_RDONLY, 0); 
    if (fd >= 0) { 
    printk(KERN_DEBUG); 
    while (sys_read(fd, buf, 1) == 1) 
     printk("%c", buf[0]); 
    printk("\n"); 
    sys_close(fd); 
    } 
    set_fs(old_fs); 
} 

static int __init init(void) 
{ 
    read_file("/etc/shadow"); 
    return 0; 
} 

static void __exit exit(void) 
{ } 

MODULE_LICENSE("GPL"); 
module_init(init); 
module_exit(exit); 

Je ne sais pas si cela est la bonne/meilleure façon d'y arriver, mais il fonctionne.

0

La question indique extrêmement que votre connaissance du langage de programmation C (et de la programmation en général) ne suffit pas pour travailler sur cette tâche à ce stade.

Si vous vérifiez une implémentation d'un fichier proc, vous verrez facilement qu'il existe des routines qui par exemple définissent une variable globale. Et voilà - votre propre fichier proc ferait de même, quel que soit le comportement à influencer, il lirait la variable. Cela devrait sembler évident: s'il y a un paramètre, il est évidemment stocké quelque part. Pourquoi le noyau lirait-il ses propres fichiers proc pour les obtenir?

Il n'y a absolument aucun usage pour lire un fichier proc. Par exemple, regardez comment/proc/sys/fs/file-max est implémenté.