강좌 & 팁
안녕하세요 판다 이우영입니다.
저번 시간에 이어서 오늘은 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 명력으로 지워 주시면 끝입니다.
그럼 결과 화면!!
자 생각한 대로 값이 나오죠?
지금처럼 아주 간단하게 작성해 보았지만 이 proc 파일 시스템을 이용하면
아주 유용한 동작을 하는 기능을 만들어 낼 수도 있습니다.
그럼 오늘도 여기 까지!!
다음시간에 만나요~