sleepy.c
上传用户:wudi5211
上传日期:2010-01-21
资源大小:607k
文件大小:2k
源码类别:

嵌入式Linux

开发平台:

C/C++

  1. /*
  2.  * sleepy.c -- the writers awake the readers (v2.1)
  3.  *
  4.  */
  5. #ifndef __KERNEL__
  6. #  define __KERNEL__
  7. #endif
  8. #ifndef MODULE
  9. #  define MODULE
  10. #endif
  11. #define __NO_VERSION__ /* don't define kernel_verion in module.h */
  12. #include <linux/module.h>
  13. #include <linux/version.h>
  14. char kernel_version [] = UTS_RELEASE;
  15. #include <linux/sched.h>  /* current and everything */
  16. #include <linux/kernel.h> /* printk() */
  17. #include <linux/fs.h>     /* everything... */
  18. #include <linux/types.h>  /* size_t */
  19. #include <asm/segment.h>
  20. #include "sysdep-2.1.h"
  21. int sleepy_major=0;
  22. struct wait_queue *wq = NULL; /* must be zeroed at the beginning */
  23. read_write_t sleepy_read (struct inode *inode, struct file *filp,
  24.                 char *buf, count_t count)
  25. {
  26.     printk(KERN_DEBUG "process %i (%s) going to sleepn",
  27.            current->pid, current->comm);
  28.     interruptible_sleep_on(&wq);
  29.     printk(KERN_DEBUG "awoken %i (%s)n", current->pid, current->comm);
  30.     return 0; /* EOF */
  31. }
  32. read_write_t sleepy_write (struct inode *inode, struct file *filp,
  33.                 const char *buf, count_t count)
  34. {
  35.     printk(KERN_DEBUG "process %i (%s) awakening the readers...n",
  36.            current->pid, current->comm);
  37.     wake_up_interruptible(&wq);
  38.     return count; /* succeed, to avoid retrial */
  39. }
  40. struct file_operations sleepy_fops = {
  41.     NULL,          /* lseek */
  42.     sleepy_read,
  43.     sleepy_write,
  44.                    /* nothing more, fill with NULLs */
  45. };
  46. int init_module(void)
  47. {
  48.     int result;
  49.     /*
  50.      * Register your major, and accept a dynamic number
  51.      */
  52.     result = register_chrdev(sleepy_major, "sleepy", &sleepy_fops);
  53.     if (result < 0) return result;
  54.     if (sleepy_major == 0) sleepy_major = result; /* dynamic */
  55.     return 0;
  56. }
  57. void cleanup_module(void)
  58. {
  59.     unregister_chrdev(sleepy_major, "sleepy");
  60. }