The read is being called multiple times...open is called just once.... Siddharth ----- Original Message ----- From: Mandeep Sandhu <Mandeep_Sandhu@xxxxxxxxxxx> Date: Monday, March 21, 2005 1:36 am Subject: Re: Character device driver problem > multiple "we did it" 's would mean your open is being called > repeatedly! :).... > > I'm not sure here....but i think you should return some EOF > character as well to indicate to the user app. that the file > contents are over...otherwise it'll try to read some more again! > > On Mon, 2005-03-21 at 01:24 -0800, Siddharth Taneja wrote: > > Hi, > > > > I am trying to build a simple character device driver which > supports > > only the open, read and release interface. The code compiles > fine and > > the module gets inserted also fine but when I do cat <device > name>, the > > read function is entered multiple times, resulting in multiple > and same > > outputs("we did it" repeated continously). I am using Suse 9.2 > with > > kernel 2.6.8-24.11. The following is the code and outputs. > > > > Thanks > > > > Siddharth > > > > > > //Building a character device driver > > > > #include <linux/module.h> > > #include <linux/kernel.h> > > #include <linux/fs.h> > > #include <asm/uaccess.h> > > > > static int Major; > > static int devOpen; > > static char msg[80]; > > static char*msgPtr; > > static int moduleOpen(struct inode *,struct file *); > > static ssize_t moduleRead(struct file *,char *,size_t,loff_t *); > > static int moduleRelease(struct inode *,struct file *); > > > > #define DEV_NAME "myModule" > > > > static struct file_operations fops = { > > .read=moduleRead, > > .open=moduleOpen, > > .release=moduleRelease > > }; > > > > int startup(void) { > > printk(KERN_EMERG "I am in\n"); > > devOpen=0; > > Major=register_chrdev(0,DEV_NAME,&fops); > > if (Major <0) { > > printk(KERN_EMERG "wtf!?\n"); > > return Major; > > } > > printk(KERN_EMERG "Heres ur maj no:%d\n",Major); > > return 0; > > } > > > > > > void cleanup(void) { > > printk(KERN_EMERG "Have to go..\n"); > > unregister_chrdev(Major,DEV_NAME); > > } > > > > static int moduleOpen(struct inode *in,struct file *fi) { > > if(devOpen==1) > > return -EBUSY; > > devOpen++; > > sprintf(msg,"we did it"); > > msgPtr=msg; > > printk(KERN_EMERG "Open seeeaa..\n"); > > return 0; > > } > > > > static ssize_t moduleRead(struct file *fi,char *buff, size_t > len, loff_t > > * offs){ > > static int cnt=8; > > printk(KERN_EMERG "Reading %d\n",len); > > > > while(cnt>=0&&len) { > > put_user(*msgPtr,buff); > > msgPtr++; > > buff++; > > cnt--; > > } > > //put_user('\0',buff); > > return len; > > } > > > > static int moduleRelease(struct inode *in,struct file* fi) { > > printk(KERN_EMERG "Release me...\n"); > > devOpen--; > > return 0; > > } > > > > module_init(startup); > > module_exit(cleanup); > > MODULE_LICENSE("GPL and additional rights"); > > > > ----------------------------------------------------------------- > ------------------------------------------------------------------- > -------------- > > > > Output (log messages) > > > > Mar 21 01:19:32 linux kernel: module first_module unsupported by > > SUSE/Novell, tainting kernel. > > Mar 21 01:19:32 linux kernel: I am in > > Mar 21 01:19:32 linux kernel: Heres ur maj no:253 > > Mar 21 01:19:46 linux kernel: Open seeeaa.. > > Mar 21 01:19:46 linux kernel: Reading 4096 > > Mar 21 01:19:46 linux last message repeated 177 times > > Mar 21 01:19:46 linux kernel: Release me... > > Mar 21 01:19:56 linux kernel: Have to go.. > > > > > > > > > > > > -- > > Kernelnewbies: Help each other learn about the Linux kernel. > > Archive: http://mail.nl.linux.org/kernelnewbies/ > > FAQ: http://kernelnewbies.org/faq/ > > > -- Kernelnewbies: Help each other learn about the Linux kernel. Archive: http://mail.nl.linux.org/kernelnewbies/ FAQ: http://kernelnewbies.org/faq/