Linux driver顺序锁操作

具体说明就不说了,直接给出demo:

seq_lock.c

#include<linux/init.h>
#include<linux/module.h>
#include<linux/kernel.h>
#include<linux/fs.h>
#include<asm/atomic.h>
#include<linux/delay.h>
#include<linux/random.h>
#include<asm/uaccess.h>
#include<linux/miscdevice.h>

#define DEVICE_NAME "seq_lock"

static DEFINE_SEQLOCK(seqlock);

static ssize_t demo_read(struct file *file,char __user *buf,size_t count,loff_t *ppos){
    
    unsigned seq;
    
    do{
        seq=read_seqbegin(&seqlock);
        
        mdelay(10000);
    }while(read_seqretry(&seqlock,seq));
    
    return 0;
}

static ssize_t demo_write(struct file *file,const char __user *buf,size_t count,loff_t *ppos){
    
    struct timeval tv;
    do_gettimeofday(&tv);
    printk("write:start sec :%ld\n",tv.tv_sec);
    
    write_seqlock(&seqlock);
    
    do_gettimeofday(&tv);
    printk("write:end sec:%ld\n",tv.tv_sec);

    write_sequnlock(&seqlock);

    return count;    

}

static struct file_operations dev_fops={

    .owner=THIS_MODULE,
    .read=demo_read,
    .write=demo_write
};

static struct miscdevice misc={
    .minor=MISC_DYNAMIC_MINOR,
    .name=DEVICE_NAME,
    .fops=&dev_fops
};

static int __init demo_init(void){
    
    int ret=misc_register(&misc);
    printk("demo_init_success\n");    
    return ret;
}

static void __exit demo_exit(void){

    printk("demo_exit_success\n");
    misc_deregister(&misc);
}

module_init(demo_init);
module_exit(demo_exit);

MODULE_LICENSE("GPL");
MODULE_AUTHOR("zhibao.liu");

Makefile:

obj-m:=seq_lock.o

build.sh:

#!bash/bin
make -C /usr/src/linux-headers-3.8.0-29-generic M=/root/workspace/drivers/seqrockmodule/

run.sh

#!bash/bin
insmod seq_lock.ko
lsmod | grep seq_lock
dmesg | grep seq_lock | tail -n 2
modinfo seq_lock.ko
rmmod seq_lock

顺序锁是写优先级高于读优先级,所以:
先打开一个终端:

cat /dev/seq_lock

然后立刻再打开一个终端:

echo "H" > /dev/seq_lock

会发现写操作会立刻执行,而读操作虽然首先开始执行,但是会发现读操作被阻塞了.

 

 

 

 

 

 

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值