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

嵌入式Linux

开发平台:

C/C++

  1. /*
  2.  * sleepy.c -- the writers awake the readers
  3.  *
  4.  * $Id: sleepy.c,v 1.11 2001/03/16 20:27:26 corbet Exp $
  5.  */
  6. #ifndef __KERNEL__
  7. #  define __KERNEL__
  8. #endif
  9. #ifndef MODULE
  10. #  define MODULE
  11. #endif
  12. #include <linux/module.h>
  13. #include <linux/sched.h>  /* current and everything */
  14. #include <linux/kernel.h> /* printk() */
  15. #include <linux/fs.h>     /* everything... */
  16. #include <linux/types.h>  /* size_t */
  17. #include "sysdep.h"
  18. int sleepy_major=0;
  19. DECLARE_WAIT_QUEUE_HEAD(wq);
  20. ssize_t sleepy_read (struct file *filp, char *buf, size_t count, loff_t *pos)
  21. {
  22.     printk(KERN_DEBUG "process %i (%s) going to sleepn",
  23.            current->pid, current->comm);
  24.     interruptible_sleep_on(&wq);
  25.     printk(KERN_DEBUG "awoken %i (%s)n", current->pid, current->comm);
  26.     return 0; /* EOF */
  27. }
  28. ssize_t sleepy_write (struct file *filp, const char *buf, size_t count,
  29. loff_t *pos)
  30. {
  31.     printk(KERN_DEBUG "process %i (%s) awakening the readers...n",
  32.            current->pid, current->comm);
  33.     wake_up_interruptible(&wq);
  34.     return count; /* succeed, to avoid retrial */
  35. }
  36. #ifdef LINUX_20 /* wrappers for 2.0 */
  37. int sleepy_read_20 (struct inode *ino, struct file *f, char *buf, int count)
  38. {
  39.     return (int)sleepy_read(f, buf, count, &f->f_pos);
  40. }
  41. int sleepy_write_20 (struct inode *ino, struct file *f, const char *b, int c)
  42. {
  43.     return (int)sleepy_write(f, b, c, &f->f_pos);
  44. }
  45. #define sleepy_read sleepy_read_20
  46. #define sleepy_write sleepy_write_20
  47. #endif  /* LINUX_20 */
  48. struct file_operations sleepy_fops = {
  49.     read:  sleepy_read,
  50.     write: sleepy_write,
  51. };
  52. int sleepy_init(void)
  53. {
  54.     int result;
  55.     SET_MODULE_OWNER(&sleepy_fops);
  56.     /*
  57.      * Register your major, and accept a dynamic number
  58.      */
  59.     result = register_chrdev(sleepy_major, "sleepy", &sleepy_fops);
  60.     if (result < 0) return result;
  61.     if (sleepy_major == 0) sleepy_major = result; /* dynamic */
  62.     return 0;
  63. }
  64. void sleepy_cleanup(void)
  65. {
  66.     unregister_chrdev(sleepy_major, "sleepy");
  67. }
  68. module_init(sleepy_init);
  69. module_exit(sleepy_cleanup);