应用层程序
#include<stdio.h>
#include<stdlib.h>
#include<sys/stat.h>
#include<sys/types.h>
#include<unistd.h>
#include<fcntl.h>
#include<string.h>
int main(int argc, char const *argv[])
{
char buf[128]="";
int fd=open("/dev/chardev",O_RDWR);
if (fd < 0)
{
printf("Error opening /dev/chardev\n");
return -1;
}
fgets(buf,sizeof(buf),stdin);
buf[strlen(buf)-1] = '\0';
write(fd,buf,sizeof(buf));
memset(buf,0,sizeof(buf));
read(fd,buf,sizeof(buf));
printf("%s\n",buf);
close(fd);
return 0;
}
内核程序
#include <linux/init.h>
#include <linux/module.h>
#include <linux/fs.h>
char kbuf[128]="";
int chardev_open(struct inode *inode, struct file *file)
{
printk("%s:%s:%d",__FILE__,__func__,__LINE__);
return 0;
}
ssize_t chardev_read(struct file *file, char __user *user, size_t size, loff_t *lof)
{
if(sizeof(kbuf)<size)
{
size=sizeof(kbuf);
}
copy_to_user(user, kbuf, size);
// if(0==kbuf[0])
// {
// printk("close led\n");
// }
// else if(1==kbuf[0])
// {
// printk("open led\n");
// }
// printk("%s:%s:%d",__FILE__,__func__,__LINE__);
return 0;
}
ssize_t chardev_write(struct file *file, const char __user *user, size_t size, loff_t *lof)
{
if(sizeof(kbuf)<size)
{
size=sizeof(kbuf);
}
copy_from_user(kbuf, user, size);
if('0'==kbuf[0])
{
printk("close led\n");
}
else if('1'==kbuf[0])
{
printk("open led\n");
}
printk("%s:%s:%d",__FILE__,__func__,__LINE__);
return 0;
}
int chardev_release(struct inode *inode, struct file *file)
{
printk("%s:%s:%d",__FILE__,__func__,__LINE__);
return 0;
}
int major;
struct file_operations fop={
.open=chardev_open,
.read=chardev_read,
.write=chardev_write,
.release=chardev_release,
};
static int __init demo_init(void)
{
major=register_chrdev(0, "chardev",&fop);
if(major<0)
{
printk("char device register failed\n");
return major;
}
printk("char device register successed:%d\n",major);
return 0;
}
static void __exit demo_exit(void)
{
unregister_chrdev(major, "chardev");
}
module_init(demo_init);
module_exit(demo_exit);
MODULE_LICENSE("GPL");