Энциклопедия разработчика модулей ядра Linux | страница 18
>* we'll have some place to specify the file operations
>* structure we want to use, and the function we use for
>* permissions. It's also possible to specify functions
>* to be called for anything else which could be done to
>* an inode (although we don't bother, we just put NULL). */
>static struct inode_operations Inode_Ops_4_Our_Proc_File = {
> &File_Ops_4_Our_Proc_File,
> NULL, /* create */
> NULL, /* lookup */
> NULL, /* link */
> NULL, /* unlink */
> NULL, /* symlink */
> NULL, /* mkdir */
> NULL, /* rmdir */
> NULL, /* mknod */
> NULL, /* rename */
> NULL, /* readlink */
> NULL, /* follow_link */
> NULL, /* readpage */
> NULL, /* writepage */
> NULL, /* bmap */
> NULL, /* truncate */
> module_permission /* check for permissions */
>};
>/* Directory entry */
>static struct proc_dir_entry Our_Proc_File = {
> 0, /* Inode number - ignore, it will be filled by proc_register[_dynamic] */
> 7, /* Length of the file name */
> "rw_test", /* The file name */
> S_IFREG | S_IRUGO | S_IWUSR,
> /* File mode - this is a regular file which
> * can be read by its owner, its group, and everybody
> * else. Also, its owner can write to it.
> *
> * Actually, this field is just for reference, it's
> * module_permission that does the actual check. It
> * could use this field, but in our implementation it
> * doesn't, for simplicity. */
> 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. */
> &Inode_Ops_4_Our_Proc_File,
> /* A pointer to the inode structure for
> * the file, if we need it. In our case we
> * do, because we need a write function. */
> NULL
> /* The read function for the file. Irrelevant,
> * because we put it in the inode structure above */
>};
>/* Module initialization and cleanup ******************* */
>/* 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
>}
>/* Cleanup - unregister our file from /proc */
>void cleanup_module() {
> proc_unregister(&proc_root, Our_Proc_File.low_ino);
>}
Работа с файлами устройств (запись и IOCTL)