深入浅出Linux设备驱动之并发控制(2)

文章作者 100test 发表时间 2007:03:14 16:31:21
来源 100Test.Com百考试题网


该宏释放自旋锁lock,它与spin_trylock或spin_lock配对使用;除此之外,还有一组自旋锁使用于中断情况下的API。

下面进入对并发控制的实战。首先,在globalvar的驱动程序中,我们可以通过信号量来控制对int global_var的并发访问,下面给出源代码:

#include 

#include 

#include 

#include 

#include  

MODULE_LICENSE("GPL").



#define MAJOR_NUM 254



static ssize_t globalvar_read(struct file *, char *, size_t, loff_t*).

static ssize_t globalvar_write(struct file *, const char *, size_t, loff_t*).



struct file_operations globalvar_fops =

{

 read: globalvar_read, write: globalvar_write,

}.

static int global_var = 0.

static struct semaphore sem.



static int __init globalvar_init(void)

{

 int ret.

 ret = register_chrdev(MAJOR_NUM, "globalvar", &.globalvar_fops).

 if (ret)

 {

  printk("globalvar register failure").

 }

 else

 {

  printk("globalvar register success").

  init_MUTEX(&.sem).

 }

 return ret.

}



static void __exit globalvar_exit(void)

{

 int ret.

 ret = unregister_chrdev(MAJOR_NUM, "globalvar").

 if (ret)

 {

  printk("globalvar unregister failure").

 }

 else

 {

  printk("globalvar unregister success").

 }

}



static ssize_t globalvar_read(struct file *filp, char *buf, size_t len, loff_t *off)

{

 //获得信号量

 if (down_interruptible(&.sem))

 {

  return - ERESTARTSYS.

 }



 //将global_var从内核空间复制到用户空间

 if (copy_to_user(buf, &.global_var, sizeof(int)))

 {

  up(&.sem).

  return - EFAULT.

 }



 //释放信号量

 up(&.sem).



 return sizeof(int).

}



ssize_t globalvar_write(struct file *filp, const char *buf, size_t len, loff_t *off)

{

 //获得信号量

 if (down_interruptible(&.sem))

 {

  return - ERESTARTSYS.

 }



 //将用户空间的数据复制到内核空间的global_var

 if (copy_from_user(&.global_var, buf, sizeof(int)))

 {

  up(&.sem).

  return - EFAULT.

 }



 //释放信号量

 up(&.sem).

 return sizeof(int).

}



module_init(globalvar_init).

module_exit(globalvar_exit).


相关文章


Linux操作系统下的离线浏览器介绍(2)
深入浅出Linux设备驱动之并发控制(3)
深入浅出Linux设备驱动之并发控制(2)
Linux操作系统套接字编程的5个隐患(3)
Linux操作系统套接字编程的5个隐患(4)
澳大利亚华人论坛
考好网
日本华人论坛
华人移民留学论坛
英国华人论坛