4月18日 驱动开发

该程序是一个用户空间的应用,通过打开并写入到名为/dev/mychrdev的字符设备文件来控制灯光。用户输入1时,设备驱动会接收到开灯指令;输入0则接收关灯指令。驱动程序使用内核函数处理读写操作,并在内核日志中打印相应的操作结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

编写一个程序,在终端输入1,内核打印开灯,输入0,内核打印关灯。

#include<stdlib.h>

#include<stdio.h>

#include<sys/types.h>

#include<sys/stat.h>

#include<fcntl.h>

#include<unistd.h>

#include<string.h>

int main(int argc,char const *argv[])

{

    char single;

    char buf[128]={0};

    int fd=open("/dev/mychrdev",O_RDWR);

    if(fd<0)

    {

        printf("打开设备失败\n");

        exit(-1);

    }

    printf("请输入0或者1\n");

    single=getchar();

    if(single='1')

    {

        strcpy(buf,"开灯");

        write(fd,buf,sizeof(buf));

    }

    else if(single='0')

    {

        strcpy(buf,"关灯");

        write(fd,buf,sizeof(buf));

    }

   

    close(fd);

    return 0;

}

#include<linux/init.h>

#include<linux/module.h>

#include<linux/fs.h>

#include<linux/uaccess.h>

int major;

char kbuf[128]={0};

int mycdev_open(struct inode *inode,struct file *file)

{

    printk("%s:%s:%d\n",__FILE__,__func__,__LINE__);

    return 0;

}

ssize_t mycdev_read(struct file *file,char *ubuf,size_t size,loff_t *lof)

{

    printk("%s:%s:%d\n",__FILE__,__func__,__LINE__);

    unsigned long ret;

    if(size>sizeof(kbuf))

       {

            size=sizeof(kbuf);

       }

    ret=copy_to_user(ubuf,kbuf,size);

    if(ret)

    {

        printk("copy_to_user failed\n");

        return ret;

    }

    return 0;

}

ssize_t mycdev_write(struct file *file,const char *ubuf,size_t size,loff_t *lof)

{

   unsigned long ret;

   if(size>sizeof(kbuf))

    {

        size=sizeof(kbuf);

    }

    ret=copy_from_user(kbuf,ubuf,size);

    if(ret)

    {

        printk("copy_from_user failed\n");

        return ret;

    }

    printk("结果是:%s\n",kbuf);

   

    return 0;

}

int mycdev_close(struct inode *inode,struct file *file)

{

    printk("%s:%s:%d\n",__FILE__,__func__,__LINE__);

    return 0;

}

struct file_operations fops={

    .open=mycdev_open,

    .read=mycdev_read,

    .write=mycdev_write,

    .release=mycdev_close,

 

};

static int __init mycdev_init(void)

{

    major=register_chrdev(0,"mychrdev",&fops);

    if(major<0)

    {

        printk("字符设备驱动注册失败\n");

        return major;

    }

    printk("字符设备驱动注册成功:major=%d\n",major);

    return 0;

}

static void __exit mycdev_exit(void)

{

    unregister_chrdev(major,"mychrdev");

}

module_init(mycdev_init);

module_exit(mycdev_exit);

MODULE_LICENSE("GPL");

#include<linux/init.h>

#include<linux/module.h>

#include<linux/fs.h>

#include<linux/uaccess.h>

int major;

char kbuf[128]={0};

int mycdev_open(struct inode *inode,struct file *file)

{

    printk("%s:%s:%d\n",__FILE__,__func__,__LINE__);

    return 0;

}

ssize_t mycdev_read(struct file *file,char *ubuf,size_t size,loff_t *lof)

{

    printk("%s:%s:%d\n",__FILE__,__func__,__LINE__);

    unsigned long ret;

    if(size>sizeof(kbuf))

       {

            size=sizeof(kbuf);

       }

    ret=copy_to_user(ubuf,kbuf,size);

    if(ret)

    {

        printk("copy_to_user failed\n");

        return ret;

    }

    return 0;

}

ssize_t mycdev_write(struct file *file,const char *ubuf,size_t size,loff_t *lof)

{

   unsigned long ret;

   if(size>sizeof(kbuf))

    {

        size=sizeof(kbuf);

    }

    ret=copy_from_user(kbuf,ubuf,size);

    if(ret)

    {

        printk("copy_from_user failed\n");

        return ret;

    }

    printk("结果是:%s\n",kbuf);

   

    return 0;

}

int mycdev_close(struct inode *inode,struct file *file)

{

    printk("%s:%s:%d\n",__FILE__,__func__,__LINE__);

    return 0;

}

struct file_operations fops={

    .open=mycdev_open,

    .read=mycdev_read,

    .write=mycdev_write,

    .release=mycdev_close,

 

};

static int __init mycdev_init(void)

{

    major=register_chrdev(0,"mychrdev",&fops);

    if(major<0)

    {

        printk("字符设备驱动注册失败\n");

        return major;

    }

    printk("字符设备驱动注册成功:major=%d\n",major);

    return 0;

}

static void __exit mycdev_exit(void)

{

    unregister_chrdev(major,"mychrdev");

}

module_init(mycdev_init);

module_exit(mycdev_exit);

MODULE_LICENSE("GPL");

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值