리눅스 문자디바이스 드라이버만드는건데요... write를 계속 수행하려면 어찌해야하나요?
글쓴이: gkdlfm / 작성시간: 일, 2013/05/05 - 11:41오전
int M = 5; int N = 15; module_param(M, int, 0); module_param(N, int, 0); char *store_buffer; char *tmp_buffer; char *temp_s; int index_buffer = 0; int *writeSize_buffer = &N; int *readSize_buffer = &M; int index=0; void chr_exit(void) { printk("exit run\n"); unregister_chrdev(MEM_DEV_MAJOR, MEM_DEV_NAME); if (store_buffer) { kfree(store_buffer); } } int chr_open(struct inode *inode, struct file *filp) { printk("open run\n"); return 0; } ssize_t chr_write( struct file *filp, char *buf, size_t count, loff_t *f_pos) { printk("write run\n"); if(*f_pos == 0) { *f_pos += 1; copy_from_user(store_buffer, buf, *writeSize_buffer); return *writeSize_buffer+1; } return 0; } ssize_t chr_read(struct file *filp, char *buf, size_t count, loff_t *f_pos) { printk("read run\n"); if(*f_pos == 0) { *f_pos += 1; if(index_buffer >= *writeSize_buffer){ return 0; } else if(strlen(store_buffer) > *readSize_buffer) { char *tmp = kmalloc(*readSize_buffer, GFP_KERNEL); strncpy(tmp, store_buffer, *readSize_buffer); tmp[*readSize_buffer]='\n'; index_buffer += *readSize_buffer; copy_to_user(buf, tmp, *readSize_buffer+1); strcpy(store_buffer, &store_buffer[*readSize_buffer]); return *readSize_buffer+1; } else if(strlen(store_buffer) <= *readSize_buffer) { store_buffer[strlen(store_buffer)]='\n'; index_buffer += strlen(store_buffer); copy_to_user(buf, store_buffer, strlen(store_buffer)+1); strcpy(store_buffer, &store_buffer[*readSize_buffer]); return strlen(store_buffer)+1; } } else { return 0; } } int chr_ioctl(struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg) { printk("ioctl run\n"); switch(cmd) { case 0 : *readSize_buffer = arg; break; case 1 : *writeSize_buffer = arg; tmp_buffer = kmalloc(*writeSize_buffer, GFP_KERNEL); strncpy(tmp_buffer,store_buffer, *writeSize_buffer-index_buffer); kfree(store_buffer); store_buffer = kmalloc(*writeSize_buffer+2, GFP_KERNEL); strcpy(store_buffer, tmp_buffer); store_buffer[strlen(store_buffer)]='\n'; break; } return 0; } int chr_release(struct inode *inode, struct file *filp) { printk("release run\n"); return 0; } struct file_operations chr_fops = { .owner = THIS_MODULE, .read = chr_read, .write = chr_write, .open = chr_open, .release = chr_release, .ioctl = chr_ioctl, }; int chr_init(void) { printk("init run\n"); int result; result = register_chrdev(MEM_DEV_MAJOR, MEM_DEV_NAME, &chr_fops); if (result < 0) { return -1; } store_buffer = kmalloc(*writeSize_buffer+1, GFP_KERNEL); tmp_buffer = kmalloc(*writeSize_buffer, GFP_KERNEL); return 0; }
코드는 이런식이구요.
cat > /dev/mem2 하면 계속 새로작성만되고
cat >> /dev/mem2 이걸하면 추가가 되야되는데... 이게 안되여 ㅠㅠ
어디가 문제인가요?
Forums:
댓글 달기