Linux driver 原子操作-管理设备被多个文件(进程)打开

下面程序演示一个设备如何同时被多个进程或者文件访问,或者只允许一个进程或者一个文件访问的原子操作.

操作步骤如下:

<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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

转载于:https://www.cnblogs.com/MMLoveMeMM/articles/3781096.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值