panda.jpg 


안녕하세요 판다 이우영입니다.


저번 시간에 이어서 오늘은 read, write를 추가 해 보겠습니다.


1. 복습!!



먼저 오늘 추가할 read, write에 대해서 간단히 알아보고 소스코드 작성해 보겠습니다.


함수 원형이 있는 include/linux/proc_fs.h 파일을 한번 보고 오는것도 도움이 됩니다.


함수는 다음과 같이 작성하면 됩니다.


int read_proc_func(char *page, char **start, off_t off, int count, int *eof, void *data_unused)

{

        읽을 data page  넣는다.

        *eof = 1;

        return  넣은 data 

} 


int write_proc_func(struct file *file, const char *buffer, unsigned long count, void *data)

{

        buffer 통해 넘어온 data 커널영역에 저장한다

       

        return 처리한 data 

}


그럼  심플하게 소스코드를 작성하러 가볼까요?


2. proc 파일 read, write 테스트




오늘은 간단하게 만들어 보겠습니다. proc 파일에 data를 쓰고 읽어 보겠습니다.


#include <linux/module.h>

#include <linux/kernel.h>

#include <linux/version.h>

#include <linux/init.h>

#include <linux/fs.h>

#include <linux/sched.h>

#include <linux/interrupt.h>

#include <linux/wait.h>

#include <linux/ioport.h>

#include <linux/slab.h>

#include <linux/poll.h>

#include <linux/proc_fs.h>

#include <linux/workqueue.h>

#include <asm/system.h>

#include <asm/uaccess.h>

#include <asm/ioctl.h>

#include <asm/unistd.h>

#include <asm/io.h>

#include <asm/irq.h>

#include <asm/gpio.h>

#include <linux/irq.h>

#include <linux/time.h>

#include <linux/timer.h>

#include <asm/mach/arch.h>

#include <linux/proc_fs.h>

 

#define INT_DEV_NAME                "proc_dev"

 

struct proc_dir_entry *proc_file    = NULL;

 

char proc_temp[ PAGE_SIZE - 80 ]    = {0,};

 

int read_proc_func(char *page, char **start, off_t off, int count, int *eof, void *data_unused)

{

    char *proc_data;

    char *buf;

 

    proc_data = (char *)data_unused;

 

    buf = page;

    buf += sprintf(buf, "return = [%s]\n", proc_data);

 

    *eof = 1;

 

    return buf - page;

}

 

int write_proc_func(struct file *file, const char *buffer, unsigned long count, void *data)

{

    char *proc_data;

 

    proc_data = (char *)data;

 

    if( copy_from_user( proc_data, buffer, count))    return -EFAULT;

 

    proc_data[count] = '\0';

 

    return count;

}

 

int proc_init() {

    printk("proc_dev_init!\n");

 

    proc_file = create_proc_entry("testfile", S_IFREG | S_IRWXU, 0);

 

    if (proc_file)

    {

        proc_file->data       = proc_temp;

        proc_file->read_proc  = read_proc_func;

        proc_file->write_proc = write_proc_func;

    }

 

    return 0;

}

 

void proc_exit() {

    printk("proc_dev_exit!\n");

 

    remove_proc_entry("testfile", 0);

}

 

module_init(proc_init);

module_exit(proc_exit);

 

MODULE_LICENSE("Dual BSD/GPL");

 



간단하죠? 그저 문자열 data를 저장 하고 출력 해주는 함수를 구현 해주었습니다.


그럼 결과를 확인해 봐야죠!!


모듈을 등록 하시고


insmod proc_dev.ko 


문자열을 입력 하겠습니다.


echo "hi proc!!" > /proc/ testfile  


문자는 echo 명령을 통해 입력 하실 수 있습니다.


그럼 파일을 읽어 볼까요?


cat  /proc/testfile 


cat 명령으로 간단하게 출력 가능합니다.


그리고 rmmod 명력으로 지워 주시면 끝입니다.


그럼 결과 화면!!


01.PNG


자 생각한 대로 값이 나오죠?


지금처럼 아주 간단하게 작성해 보았지만 이 proc 파일 시스템을 이용하면


아주 유용한 동작을 하는 기능을 만들어 낼 수도 있습니다.


그럼 오늘도 여기 까지!!


다음시간에 만나요~