Энциклопедия разработчика модулей ядра Linux | страница 39
>static struct wait_queue *WaitQ = NULL;
>static void intrpt_routine(void *);
>/* The task queue structure for this task, from tqueue.h */
>static struct tq_struct Task = {
> NULL, /* Next item in list - queue_task will do
> * this for us */
> 0, /* A flag meaning we haven't been inserted
> * into a task queue yet */
> intrpt_routine, /* The function to run */
> NULL /* The void* parameter for that function */
>};
>/* This function will be called on every timer
>* interrupt. Notice the void* pointer - task functions
>* can be used for more than one purpose, each time
>* getting a different parameter. */
>static void intrpt_routine(void *irrelevant) {
> /* Increment the counter */
> TimerIntrpt++;
> /* If cleanup wants us to die */
> if (WaitQ != NULL) wake_up(&WaitQ);
> /* Now cleanup_module can return */
> else queue_task(&Task, &tq_timer);
> /* Put ourselves back in the task queue */
>}
>/* Put data into the proc fs file. */
>int procfile_read(char *buffer, char **buffer_location, off_t offset, int buffer_length, int zero) {
> int len; /* The number of bytes actually used */
> /* This is static so it will still be in memory
> * when we leave this function */
> static char my_buffer[80];
> static int count = 1;
> /* We give all of our information in one go, so if
> * the anybody asks us if we have more information
> * the answer should always be no. */
> if (offset > 0) return 0;
> /* Fill the buffer and get its length */
> len = sprintf(my_buffer, "Timer was called %d times so far\n", TimerIntrpt);
> count++;
> /* Tell the function which called us where the buffer is */
> *buffer_location = my_buffer;
> /* Return the length */
> return len;
>}
>struct proc_dir_entry Our_Proc_File = {
> 0, /* Inode number - ignore, it will be filled by
> * proc_register_dynamic */
> 5, /* Length of the file name */
> "sched", /* The file name */
> S_IFREG | S_IRUGO,
> /* File mode - this is a regular file which can
> * be read by its owner, its group, and everybody else */
> 1, /* Number of links (directories where
> * the file is referenced) */
> 0, 0, /* The uid and gid for the file - we give it to root */
> 80, /* The size of the file reported by ls. */
> NULL, /* functions which can be done on the
> * inode (linking, removing, etc.) - we don't
> * support any. */
> procfile_read,
> /* The read function for this file, the function called
> * when somebody tries to read something from it. */
> NULL
> /* We could have here a function to fill the