编写一个程序,在终端输入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");