Энциклопедия разработчика модулей ядра 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)