2017-09-25 65 views
0

假設我正在爲Linux內核版本2.6.9編寫系統調用,並且希望我的調用行爲根據/proc文件系統中的參數進行更改。如果我已經在/proc/sys/kernel中創建了一個條目,並且可以通過標準的catecho在用戶空間中讀取和寫入,那麼我該如何從系統調用中讀取參數的值?通過/ 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是如何實現的。