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

嵌入式Linux

开发平台:

C/C++

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