2012-02-13 4 views
0

ロード可能なカーネルモジュールによって作成された/ procファイルを書き込もうとしています。私は書き込みのためにファイルを開くのにfopen()を使用していますが、errno:13(permission denied)を取得しています。Errno:13 on procエントリでfopenを使用する

FILE *fp; 
fp = fopen("/proc/file1","w"); 
if(fp == NULL){ 
    printf("Errno : %d",errno); // prints 13 
} 

The LKM contains the following code: 

static struct proc_dir_entry *proc_entry; 

static ssize_t proc_write(struct file *filp, const char __user *buff, unsigned long len, void *data) 
{ 
    // code writes from buffer to local variable 

    return len; 
} 

static ssize_t proc_read(char *page, char **start, off_t off, int count, int *eof, void *data) 
{ 
    // code for reading file 

    return 0; 
} 


int proc_open(struct inode *inode, struct file *file) 
{ 
    try_module_get(THIS_MODULE); 
    return 0; 
} 

int proc_close(struct inode *inode, struct file *file) 
{ 
    module_put(THIS_MODULE); 
    return 0; 
} 

これを解決する方法についてのご意見はありますか?

ありがとうございました。

+0

あなたはrootとして実行するとまだ失敗しますか? –

+2

ファイルをrootとして開きますか?カーネルモジュールはファイルへの書き込みアクセスを許可していますか?詳細情報が必要 – Petesh

+0

実行ファイルがset-root-UIDになっても失敗しません。 – Jake

答えて

2

最も可能性の高い答えは、作成されたprocfsノードにユーザーの正しいアクセス許可がないことです。

rootとして実行すると、ノードのアクセス権チェックのほとんどがバイパスされるため、エラーは発生しません(例外がありますが、これは一般的なケースです)。

create_proc_entry(...) 

あなたは二番目のパラメータは、モードはその許可何かに設定されていることを確認する必要があります。それは(.cファイル内のどこか)のprocfsノードを作成し、カーネルローダブルモジュール、中

あなたの望むオープンオプションをサポートするためにroot以外のユーザーが書くためのオープン。例えば 0666は誰でもファイルをR/Wとしてグローバルに開くことができます。

一般に、procfsのノードは、フラグ0444(つまり、すべてのユーザーに対してのみR/O)を使用して作成されます。一部はモード0644(ルートではR/W、他のすべてのユーザではR/O)で作成され、一部はアクセス許可0400(ルートではR/O、それ以外はすべて離れます)で作成されます。

関連する問題