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/