/* We give all of our information in one go, so if the

 * user asks us if we have more information the

 * answer should always be no.

 *

 * This is important because the standard read

 * function from the library would continue to issue

 * the read system call until the kernel replies

 * that it has no more information, or until its * buffer is filled. */

 if (offset > 0) return 0;

 /* Fill the buffer and get its length */

 len = sprintf(my_buffer, "For the %d%s time, go away!\n", count,

  (count % 100 > 10 && count % 100 < 14) ? "th" :

  (count % 10 == 1) ? "st" : (count % 10 == 2) ? "nd" :

  (count % 10 == 3) ? "rd" : "th" );

 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] */

 4, /* Length of the file name */

 "test", /* 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 file's inode, to enable us to play with permissions, ownership, etc. */

};

/* Initialize the module - register the proc file */

int init_module() {

 /* Success if proc_register[_dynamic] is a success, failure otherwise. */

#if LINUX_VERSION_CODE > KERNEL_VERSION(2,2,0)

 /* In version 2.2, proc_register assign a dynamic

 * inode number automatically if it is zero in the

 * structure, so there's no more need for

 * proc_register_dynamic */

 return proc_register(&proc_root, &Our_Proc_File);

#else

 return proc_register_dynamic(&proc_root, &Our_Proc_File);

#endif

 /* proc_root is the root directory for the proc fs (/proc). This is where we want our file to be located. */

}

/* Cleanup - unregister our file from /proc */

void cleanup_module() {

 proc_unregister(&proc_root, Our_Proc_File.low_ino);

}

<p>Использование /proc для ввода</p>

Пока мы имеем два способа генерировать вывод из модулей: мы можем зарегистрировать драйвер устройства и создать mknod файл устройства, или мы можем создать /proc файл. Это позволяет модулю сообщать нам что-нибудь. Единственная проблема в том, что не имеется никакого пути для нас, чтобы возразить. Первый путем, которым мы пошлем ввод модулям, будет запись обратно в файл в системе /proc.

Перейти на страницу:

Все книги серии Проект russian ldp

Похожие книги