下面程序演示一个设备如何同时被多个进程或者文件访问,或者只允许一个进程或者一个文件访问的原子操作.
操作步骤如下:
<1> : 编写一个atomic.c的驱动程序:
#include#include #include #include #include #include #include #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/binmake -C /usr/src/linux-headers-3.8.0-29-generic M=/root/workspace/drivers/atomicmodule/
<4> : 再编一个转载卸载和显示设备信息的脚本,方便build后,看看效果:
#!bash/bininsmod atomic.kolsmod | grep atomicdmesg | grep atomic | tail -n 2modinfo atomic.kormmod atomic
<5> : 编写完上面的,基本上,只需要在终端运行脚本就可以了,可以将脚本设置为可执行:
chmod u+x ***.sh
<6> : 上面运行上面的run.sh并没有转载好atomic这个设备,因为它最后一句话rmmod atomic卸载了,所以要装载,在终端输入insmod atomic.ko
<7> : 测试程序就简单了,只需要打开这个设备:
atomic_test.c
#include#include 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_testgcc -o atomic_test atomic_test.o
<8> 如果驱动里面的atom的值设为0,那么可以被多个文件和进程打开,如果设置为1,那么只能被一个文件和进程打开.
测试在多个终端中运行./atomic_test