2017-09-25 4 views
0

Linuxカーネルバージョン2.6.9のシステムコールを書いていて、/procファイルシステムのパラメータに基づいて呼び出しの動作を変更したいとします。すでにcatechoでユーザー空間に読み書き可能なエントリを/proc/sys/kernelに作成している場合、システムコールからパラメータの値を読み取るにはどうすればよいですか?/procを使用してシステムコールの動作を変更しますか?


これは重複した質問であることが示唆されています。私はカーネル内部から作業しているので、標準のユーザライブラリにアクセスすることはできません。また、私は別のプロセスの出力を読み込もうとしていませんが、私は値を読み取ろうとしています/proc/sys/kernel/myfoobar

+0

[Cから外部プログラムを実行して出力を解析するにはどうすればいいですか?](https://stackoverflow.com/questions/43116/how-can-i-run-an-external-program-from -c-and-parse-its-output) – jack

+0

あなたの質問は簡略化されていると思います。 – jack

+0

>私の呼び出しの動作を/ procファイルシステムのパラメータに基づいて変更したい<これは悪いAPI設計のようだ。 >私はカーネル内部から作業しています。<なぜカーネル内から変更できるだけのユーザー空間でアクセス可能なチューニング可能ファイルが必要か理解できません。あなたがそれを実装する方法に関するいくつかのコードはちょっと役立つかもしれません – myaut

答えて

0

システムコール内から、私は/proc/sys/kernel/myfoobarをコードの修正版グレッグ・クロー=ハートマンの記事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); 

これは、これを達成するための正しい/最良の方法であるかどうかは知りませんが、それは動作します。

0

Cプログラミング言語(および一般的なプログラミング)に精通していることは、この時点でこの課題に取り組むには不十分であることを非常に示唆しています。

procファイルの実装をチェックすると、たとえばグローバル変数を設定するルーチンが簡単にわかります。そして、そこに行く - あなた自身のprocファイルは同じことをするだろう、そして影響を受けるどんな振る舞いでも変数を読むだろう。それは明らかな意味があるはずです:設定がある場合、それは明らかにどこかに格納されます。なぜカーネルがprocファイルを読み込んでそれを入手するのですか?

procファイルの読み込みには、ほとんどの場合、0が使用されます。たとえば、/ proc/sys/fs/file-maxがどのように実装されているかを調べてください。

関連する問題