博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
使用register_chrdev注册字符设备
阅读量:4298 次
发布时间:2019-05-27

本文共 3046 字,大约阅读时间需要 10 分钟。

                                   使用register_chrdev注册字符设备

注册字符设备可以使用register_chrdev函数。

int register_chrdev (unsigned int major, const  char *name, struct file_operations*fops); 

register_chrdev函数的major参数如果等于0,则表示采用系统动态分配的主设备号。

注销字符设备可以使用unregister_chrdev函数。

int unregister_chrdev(unsigned int major, const char *name); 

例  register_chrdev注册字符设备实例

核心代码如下所示:

static unsigned char simple_inc=0;   
static unsigned char demoBuffer[256];  
int simple_open(struct inode *inode, struct file *filp)  
{  
    if(simple_inc>0)return -ERESTARTSYS;  
    simple_inc++;  
    return 0;  
}  
int simple_release(struct inode *inode, struct file *filp)  
{  
    simple_inc--;  
    return 0;  
}  
ssize_t simple_read(struct file *filp, char __user *buf, size_t count,loff_t *f_pos)  
{  
    /* 把数据复制到应用程序空间 */  
    if (copy_to_user(buf,demoBuffer,count))  
    {  
       count=-EFAULT;   
    }  
    return count;  
}  
ssize_t simple_write(struct file *filp, const char __user *buf, size_t count,loff_t *f_pos)  
{  
    /* 把数据复制到内核空间 */  
    if (copy_from_user(demoBuffer+*f_pos, buf, count))  
    {  
        count = -EFAULT;  
    }  
    return count;  
}  
struct file_operations simple_fops = {  
    .owner =    THIS_MODULE,  
    .read =     simple_read,  
    .write =    simple_write,  
    .open =     simple_open,  
    .release =  simple_release,  
};  
/*******************************************************  
                MODULE ROUTINE  
*******************************************************/  
void simple_cleanup_module(void)  
{  
    unregister_chrdev(simple_MAJOR,  "simple");   
    printk("simple_cleanup_module!\n");  
}  
int simple_init_module(void)  
{  
    int ret;  
    //根据设备号与设备名注册字符设备  
    ret = register_chrdev(simple_MAJOR, "simple", &simple_fops);   
    if (ret < 0)  
    {  
        printk("Unable to register character device %d!\n",simple_MAJOR);  
        return ret;  
    }  
    return 0;  
}  
module_init(simple_init_module);  
module_exit(simple_cleanup_module);  

应用程序的代码如下:
void main(void)   
{  
    int fd;  
    int i;  
    char data[256];  
    int retval;  
    fd=open("/dev/fgj",O_RDWR);  
    if(fd==-1)  
    {  
        perror("error open\n");  
        exit(-1);  
    }  
    printf("open /dev/fgj successfully\n");  
    //写数据  
    retval=write(fd,"fgj",3);  
    if(retval==-1)  
    {  
        perror("write error\n");  
        exit(-1);  
    }  
    //读数据  
    retval=read(fd,data,3);  
    if(retval==-1)  
    {  
        perror("read error\n");  
        exit(-1);  
    }  
    data[retval]=0;  
    printf("read successfully:%s\n",data);  
    //关闭设备  
    close(fd);  
}  

字符设备模块使用insmod加载,加载完毕需要在/dev目录下使用mkmod命令建立相应的文件结点,编译生成的应用层可执行程序为test。本例运行结果如下:
[root@/home]#insmod demo.ko   
[root@urbetter /home]# mknod /dev/fgj c 224 0  
[root@urbetter /home]# ./test   
open /dev/fgj successfully  
read successfully:fgj

转载地址:http://gknws.baihongyu.com/

你可能感兴趣的文章
apache下虚拟域名配置
查看>>
session和cookie区别与联系
查看>>
PHP 实现笛卡尔积
查看>>
Laravel中的$loop
查看>>
CentOS7 重置root密码
查看>>
Centos安装Python3
查看>>
PHP批量插入
查看>>
laravel连接sql server 2008
查看>>
Laravel 操作redis的各种数据类型
查看>>
Laravel框架学习笔记之任务调度(定时任务)
查看>>
laravel 定时任务秒级执行
查看>>
浅析 Laravel 官方文档推荐的 Nginx 配置
查看>>
Swagger在Laravel项目中的使用
查看>>
Laravel 的生命周期
查看>>
CentOS Docker 安装
查看>>
Nginx
查看>>
Navicat远程连接云主机数据库
查看>>
Nginx配置文件nginx.conf中文详解(总结)
查看>>
Mysql出现Table 'performance_schema.session_status' doesn't exist
查看>>
MySQL innert join、left join、right join等理解
查看>>