리눅스 문자디바이스 드라이버만드는건데요... write를 계속 수행하려면 어찌해야하나요?

gkdlfm의 이미지

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 이걸하면 추가가 되야되는데... 이게 안되여 ㅠㅠ
어디가 문제인가요?

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.