character device driver using MUTEX in linux
character device driver using MUTEX in linux MUTEX DRIVER# include < linux/module.h > # include < linux/fs.h > # include < linux/major.h > # include < linux/capability.h > # include < asm/uaccess.h > # include < linux/cdev.h > # include < linux/vmalloc.h > # include < linux/ipc.h > # include < linux/delay.h > # include < linux/mutex.h > int i, shmid; char * a; struct mutex lock; static ssize_t sample_char_read( struct file * file, char __user * buf, size_t count, loff_t * ppos) { printk( " sample_char2_read size( %ld ) " , count) ; return 0 ; } static ssize_t sample_char_write( struct file * filp, const char * buf, size_t size, loff_t * offp) { //mutex lock mutex_lock( & lock) ; printk( " sample_char_write size( %ld ) " , size) ; copy_from_user( ( void * ) a, buf, size) ; printk( " %s " , a) ; msleep( 3000 ) ; //mutex unlock mutex_unlock( & lock) ; return size; } int sample_char_open( struct inode * inode, struct file * filp) { printk( " sample_char_open " ) ; //mutex initialization mutex_init( & lock) ; a= ( void * ) vmalloc( 20 * sizeof ( char ) ) ; return 0 ; } int sample_char_release( struct inode * inode, struct file * filp) { printk( " sample_char_release " ) ; return 0 ; } static struct file_operations sample_char_fops = { read: sample_char_read, write: sample_char_write, open: sample_char_open, release: sample_char_release, } ; # define sample_major_number 89 # define max_minors 1 static struct cdev char_cdev; static dev_t dev; int init_module( void ) { int ret = 0 ; dev = MKDEV( sample_major_number, 0 ) ; printk( " Loading the sample char device driver " ) ; ret = register_chrdev_region( dev, 1 , " sample_char " ) ; if ( ret) { printk( " register_chrdev_region Error " ) ; goto error ; } cdev_init( & char_cdev, & sample_char_fops) ; ret = cdev_add( & char_cdev, dev, 2 ) ; if ( ret) { printk( " cdev_add Error " ) ; goto error_region ; } return 0 ; error_region: unregister_chrdev_region( dev, max_minors) ; error: return ret; } void cleanup_module( void ) { cdev_del( & char_cdev) ; unregister_chrdev_region( dev, max_minors) ; printk( " Unloading the sample char device driver " ) ; } APPLICATION FILE # include < stdio.h > # include < fcntl.h > # include < assert.h > # include < string.h > // for memset and strlen # include < sys/types.h > # include < sys/stat.h > int main ( int argc , char * argv[ ] ) { // assert( argc > 1 ) ; //abort program if assertion is false char buf[ 100 ] ; char i = 0 ; int g; memset ( buf, 0 , 100 ) ; printf ( " Input: %s " , argv[ 1 ] ) ; int fp = open( " /dev/sample_mutex " , O_RDWR) ; if ( fp< 0 ) { perror ( " not sucess " ) ; } i= fork( ) ; if ( i= = 0 ) { g= write( fp, argv[ 1 ] , strlen ( argv[ 1 ] ) ) ; } else { g= write( fp, argv[ 2 ] , strlen ( argv[ 2 ] ) ) ; wait( 0 ) ; } }