歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux技術 >> Linux Proc文件系統

Linux Proc文件系統

日期:2017/3/3 12:43:42   编辑:Linux技術
/proc文件系統一中虛擬文件系統,提供了一種內核空間和內核空間通信新的方式,虛擬文件系統相對其它文件系統,文件時動態生成的,起初,/proc文件系統就是為了提供內核運行的一些基本信息,下面將做一個簡單/proc文件讀寫操作。
proc_test.c 源碼如下
[code]#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/proc_fs.h>
#include <linux/string.h>
#include <asm/uaccess.h>
#include <linux/seq_file.h>
#include <linux/slab.h>
MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("proc write and read");
MODULE_AUTHOR("lchj");
#define PROC_TEST_FILE_NAME "proc_test_file"
#define PROC_TEST_PARENT_FILE_NAME NULL
static int proc_test_read(struct file *flip,char *buf,size_t count,loff_t *f_ops);
static int proc_test_write(struct file *flip,char *buf,size_t count,loff_t *f_ops);
static struct proc_dir_entry *proc_entry;

int len,temp;
static char *str;
static char test[100];
struct file_operations hello_proc_fops = {
    read :proc_test_read,
    .write = proc_test_write
};
int init_proc_module(void){
    printk("proc_test_modlue_init\n");
    proc_entry = proc_create( PROC_TEST_FILE_NAME, 0466, PROC_TEST_PARENT_FILE_NAME ,&hello_proc_fops);
    str ="hello proc test";
    len = strlen(str);
    temp = len;
    printk("%d",len);
    return 0;
}

void exit_proc_module(void){
    printk("proc_test module exit\n");
    remove_proc_entry(PROC_TEST_FILE_NAME,PROC_TEST_PARENT_FILE_NAME);
}

static int proc_test_read(struct file *flip,char *buf,size_t count,loff_t *f_ops){
    printk("test\n");
    printk("%d\n",count);
    if(count>temp){
        count=temp;
    }
    printk("%d\n",count);
    temp=temp-count;
    copy_to_user(buf,str, count);
    if(count==0){
        temp=len;
    }
    printk("%d\n",count);
    return count;
}
static int proc_test_write(struct file *flip,char *buf,size_t count,loff_t *f_ops){
    printk("write  count%zu",count);
    str = kmalloc(100,GFP_KERNEL);
    copy_from_user(str,buf,count);
    len = strlen(str);
    temp = len;
    return count;
}

module_init(init_proc_module);
module_exit(exit_proc_module);

MakeFile文件如下
[code]obj-m += proc_test.o
CURRENT_PATH := $(shell pwd)
LINUX_KERNEL := $(shell uname -r)
LINUX_KERNEL_PATH := /usr/src/linux-headers-$(LINUX_KERNEL)
all:
    make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) modules
clean:uninstall
    make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) clean
install:
    sudo insmod proc_test.ko
uninstall:
    sudo rmmod proc_test
log:
    dmesg
read:
    cat /proc/proc_test_file
write:
    echo ${str} > /proc/proc_test_file

運行效果如下
[code]lchj@lchj-VirtualBox:~/Documents/proc_test$ make install
sudo insmod proc_test.ko
[sudo] password for lchj: 
lchj@lchj-VirtualBox:~/Documents/proc_test$ make read
cat /proc/proc_test_file
hello proc testlchj@lchj-VirtualBox:~/Documents/proc_test$ make write str=hi,lchj!
echo hi,lchj! > /proc/proc_test_file
lchj@lchj-VirtualBox:~/Documents/proc_test$ make read
cat /proc/proc_test_file
hi,lchj!
lchj@lchj-VirtualBox:~/Documents/proc_test$ make write str=hi,proc
echo hi,proc > /proc/proc_test_file
lchj@lchj-VirtualBox:~/Documents/proc_test$ make read
cat /proc/proc_test_file
hi,proc

代碼很簡單,如沒有Linux driver相關經驗的話,需要注意一下代碼中的read方法會掉用多次。
代碼github地址
Copyright © Linux教程網 All Rights Reserved