Re: Character device driver problem

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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/


[Index of Archives]     [Newbies FAQ]     [Linux Kernel Mentors]     [Linux Kernel Development]     [IETF Annouce]     [Git]     [Networking]     [Security]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux RAID]     [Linux SCSI]     [Linux ACPI]
  Powered by Linux