Wednesday, November 11, 2015

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)\n", 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)\n", size);
copy_from_user((void *)a,buf,size);
printk("%s\n",a);
msleep(3000);
//mutex unlock
mutex_unlock(&lock);
return size;
}

int sample_char_open(struct inode *inode, struct file *filp)
{
printk("sample_char_open\n");
//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\n");
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("\nLoading the sample char device driver\n");

ret = register_chrdev_region(dev,1, "sample_char");
if (ret)
{
printk("register_chrdev_region Error\n");
goto error;
}

cdev_init(&char_cdev, &sample_char_fops);
ret = cdev_add(&char_cdev, dev,2);

if (ret) {
printk("cdev_add Error\n");
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("\nUnloading the sample char device driver\n");
}


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\n", 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);
}
}

No comments:

Post a Comment