下面程序演示一个设备如何同时被多个进程或者文件访问,或者只允许一个进程或者一个文件访问的原子操作.
操作步骤如下:
<1> : 编写一个atomic.c的驱动程序:
#include<linux/module.h> #include<linux/init.h> #include<linux/kernel.h> #include<linux/fs.h> #include<linux/miscdevice.h> #include<asm/uaccess.h> #include<asm/atomic.h> #define DEVICE_NAME "atomic" static int atom=1; static atomic_t int_atomic_available=ATOMIC_INIT(1); static int atomic_open(struct inode *node,struct file *file){ if(atom){ if(!atomic_dec_and_test(&int_atomic_available)){ atomic_inc(&int_atomic_available); return -EBUSY; } } printk("atomic dev open successfully !\n"); return 0; } static int atomic_release(struct inode *node,struct file *file){ if(atom){ atomic_inc(&int_atomic_available); } printk("atomic dev release successfully !\n"); return 0; } static struct file_operations dev_fops={ .owner=THIS_MODULE, .open=atomic_open, .release=atomic_release }; static struct miscdevice misc={ .minor=MISC_DYNAMIC_MINOR, .name=DEVICE_NAME, .fops=&dev_fops }; static int __init atomic_init(void){ int ret=misc_register(&misc); printk("atomic_init_success\n"); return ret; } static void __exit atomic_exit(void){ printk("atomic_exit_success\n"); misc_deregister(&misc); } module_init(atomic_init); module_exit(atomic_exit); module_param(atom,int,S_IRUGO|S_IWUSR); MODULE_LICENSE("GPL"); MODULE_AUTHOR("zhibao.liu");
写多了就是这个套路...
<2> : 编写Makefile文件:
obj-m :=atomic.o
<3> : 编写一个shell脚本,一次编写,多次简单运行:
#!bash/bin make -C /usr/src/linux-headers-3.8.0-29-generic M=/root/workspace/drivers/atomicmodule/
<4> : 再编一个转载卸载和显示设备信息的脚本,方便build后,看看效果:
#!bash/bin insmod atomic.ko lsmod | grep atomic dmesg | grep atomic | tail -n 2 modinfo atomic.ko rmmod atomic
<5> : 编写完上面的,基本上,只需要在终端运行脚本就可以了,可以将脚本设置为可执行:
chmod u+x ***.sh
<6> : 上面运行上面的run.sh并没有转载好atomic这个设备,因为它最后一句话rmmod atomic卸载了,所以要装载,在终端输入insmod atomic.ko
<7> : 测试程序就简单了,只需要打开这个设备:
atomic_test.c
#include<stdio.h> #include<errno.h> int main(){ int handler=open("/dev/atomic",0); printf("handler : %d\n",handler); if(handler>0){ getchar(); close(handler); }else{ printf("errno:%d\n",errno); } }
编译:
gcc -c atomic_test.c -o atomic_test
gcc -o atomic_test atomic_test.o
<8> 如果驱动里面的atom的值设为0,那么可以被多个文件和进程打开,如果设置为1,那么只能被一个文件和进程打开.
测试在多个终端中运行./atomic_test