赞
踩
sizeof()
和strlen()
char buf[100] = "hello";
write(fd,buf,sizeof(buf));//代表写入了100个字节,但是我们实际上是想只写hello,
//这时就应该是
write(fd,buf,strlen(buf));//这样就是只写入hello
cat /proc/devices查看已有设备
静态申请:register_chrdev_region
可能出现该设备号被占用,注册失败
动态申请:alloc_chrdev_region
自动分配设备号
int alloc_chrdev_region(dev_t* dev,unsigned,unsigned,const char *)
参数1:会自动将分配的设备号村放入第一个参数所指向的地方;
参数2:表示次设备号的起点
参数3:设备的个数
参数4:设备名,也就是在/proc/devices中显示的名字
#include<linux/modules.h> #include<linux/kernel.h> #include<linux/init.h> #include<linux/fs.h> #include<linux/cdev.h> static int char_major; //主设备号 static int char_minor;//次设备号的起点 static number_of_devices =1;//设备个数 static _init char_init(int) { dev_t dev; //获取到的设备号存放在dev中 alloc_chrdev_region(&dev,char_minior,number_of_devices,"char"); char_major = MAJOR(dev); //提取主设备号 return 0; } static void _exit char_exit(void) { dev_t dev = MKDEV(char_major,char_minor); unregister_chrdev_region(dev,number_of_devices); return 0; }
除了常规的读写以外,还有一些特殊的操作,ioctl就是主要用于文件的特殊读写。特殊操作比如:光驱:有弹出光盘,串口:要设置波特率,这个靠read/write无法完成。一般使用ioctl。
应用程序中使用ioctl
int ioctl(int fd,int request,....)//参数1:文件描述符;参数2:对该文件(设备)进行何种操作,不同的设备有不同的操作。
#include <sys/types.h> #include <sys/stst.h> #include <unistd.h> #include <fcntl.h> #include <sys/ioctl.h> #include <stdio.h> #include <string.h> #include <char.h> int main() { int fd = open("/dev/hello",O_RDWR); //可以用ioctl对设备进行特殊操作 ioctl(fd,CHAR_ONE);//对设备进行CHAR_ONE操作 inctl(fd,CHAR_TWO);//对设备进行CHAR_TWO操作 close(fd); return 0; }
内核中的ioctl
struct file_operations fops = { .... unlocked_ioctl = char_ioctl; .... } ```c long char_ioctl(struct file *file,unsigned int cmd,unsigned long arg) { int ret = 0; switch(cmd) case CHAR_ONE: printk(KERN_INFO"char_one\n"); break; case CHAR_TWO: printk(KERN_INFO"char_two\n"); break; }
驱动文件和应用文件共用的头文件
#idndef _CHAR_H_
#define _CHAR_H_
#define CAHR_ONE 0;
#define CAHR_TWO 1;
#endif
创建一个字符设备
mknod /dev/hello c 250 0
结果
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。