埋め込みlinux下p...

3830 ワード

原文アドレス:埋め込みlinux下procファイルの読み書き
作者:skdkjxy
in Linux、procファイルシステムは仮想ファイルシステムであり、ユーザーとアプリケーションはprocファイルシステムを通じて現在のシステム情報を得ることができ、カーネルのパラメータを変更することができる./Procの下のファイルは特殊なファイルで、一般的なファイルのように削除を作成することはできません.次にprocファイルの作成、削除、および読み書きについて説明します.
1.ディレクトリの作成:
[c] view plain copy
  • struct proc_dir_entry *proc_mkdir(const char *name,  
  •                 struct proc_dir_entry *parent);  

  • 2.procファイルの作成:
    [c] view plain copy
  • struct proc_dir_entry *create_proc_entry( const char *name,  mode_t mode,  
  •                 struct proc_dir_entry *parent );  

  • create_proc_entry関数は、一般的なprocファイルを作成するために使用されます.nameは「hello」などのファイル名で、modeはファイルモードで、parentは作成するprocファイルの親ディレクトリです(parent=NULLの場合は/procディレクトリの下に作成されます).
    3.procファイル/ディレクトリを削除する
    [c] view plain copy
  • void remove_dir_entry(const char *name, struct proc_dir_entry *parent);  

  • パラメータとproc_mkdir()関数類似
    4.読み書き可能なprocファイルの作成
    Procファイルは実際にはprocと呼ばれていますdir entryのstruct(proc_fs.hで定義)はint read_があるstructprocとint write_Procの2つの要素は、procのファイルの読み書きを実現するには、この2つの要素に値を割り当てます.しかし,ここでは単純に1つの整数を過去に代入すればよいのではなく,2つのコールバック関数を実現する必要がある.
    ユーザーまたはアプリケーションがprocファイルにアクセスすると、この関数が呼び出され、この関数を実現するには、ユーザーに見せたい内容をpageに入れるだけです.
    コールバック関数プロトタイプの書き込み:int mod_write( struct file *filp, const char __user *buff, unsigned long len, void *data );
    ユーザまたはアプリケーションがprocファイルを書こうとすると、この関数が呼び出され、この関数を実現するにはユーザが書いたデータ(buffパラメータ)を受信する必要があります.
    モジュールテストprocファイルの読み書きを書きます.
    [c] view plain copy
  • #include linux/module.h  
  • #include linux/kernel.h  
  • #include linux/proc_fs.h  
  • #include linux/sched.h  
  • #include asm/uaccess.h  
  •    
  • #define STRINGLEN 1024  
  •    
  • char global_buffer[STRINGLEN];  
  •    
  • struct proc_dir_entry *example_dir, *hello_file;  
  •    
  • int proc_read_hello(char *page, char **start, off_t off, int count, int *eof,  
  •                 void *data) {  
  •         int len;  
  •         len = sprintf(page, global_buffer);//global_をbufferの内容は訪問者
  • に表示される
  •         return len;  
  • }  
  •    
  • int proc_write_hello(struct file *file, const char *buffer, unsigned long count,  
  •                 void *data) {  
  •         int len;  
  •    
  •         if (count = STRINGLEN)  
  •                 len = STRINGLEN – 1;  
  •         else  
  •                 len = count;  
  •    
  •           
  •         copy_from_user(global_buffer, buffer, len);  
  •         global_buffer[len] = ′;  
  •         return len;  
  • }  
  •    
  • static int __init proc_test_init(void) {  
  •         example_dir = proc_mkdir("proc_test", NULL);  
  •         hello_file = create_proc_entry("hello", S_IRUGO, example_dir);  
  •         strcpy(global_buffer, "hello");  
  •         hello_file->read_proc = proc_read_hello;  
  •         hello_file->write_proc = proc_write_hello;  
  •         return 0;  
  • }  
  •    
  • static void __exit proc_test_exit(void) {  
  •         remove_proc_entry("hello", example_dir);  
  •         remove_proc_entry(“proc_test”, NULL);  
  • }  
  •    
  • module_init(proc_test_init);  
  • module_exit(proc_test_exit);  

  • procファイルへの書き込み
    echo "Hello from kernel" /proc/proc_test/hello'
    

    Procファイルの内容を読み込むと、私たちが書いた文字列が画面に表示されます:Hello from kernel
    cat /proc/proc_test/hello