We have seen how to read and write a /proc file with the /proc interface. But it's also possible to manage /proc file with inodes. The main interest is to use advanced function, like permissions.
In Linux, there is a standard mechanism for file system registration. Since every file system has to have its own
functions to handle inode and file operations[1],
there is a special structure to hold pointers to all those functions, struct inode_operations
, which
includes a pointer to struct file_operations
. In /proc, whenever we register a new file, we're allowed to
specify which struct inode_operations
will be used to access to it. This is the mechanism we use, a
struct inode_operations
which includes a pointer to a struct file_operations
which
includes pointers to our procfs_read
and procfs_write
functions.
Another interesting point here is the module_permission
function. This function is called whenever
a process tries to do something with the /proc file, and it can decide whether to allow
access or not. Right now it is only based on the operation and the uid of the current user (as available in
current
, a pointer to a structure which includes information on the currently running process), but it
could be based on anything we like, such as what other processes are doing with the same file, the time of day, or the last
input we received.
It's important to note that the standard roles of read and write are reversed in the kernel. Read functions are used for output, whereas write functions are used for input. The reason for that is that read and write refer to the user's point of view --- if a process reads something from the kernel, then the kernel needs to output it, and if a process writes something to the kernel, then the kernel receives it as input.
Still hungry for procfs examples? Well, first of all keep in mind, there are rumors around, claiming that procfs is on it's way out, consider using sysfs instead. Second, if you really can't get enough, there's a highly recommendable bonus level for procfs below linux/Documentation/DocBook/ . Use make help in your toplevel kernel directory for instructions about how to convert it into your favourite format. Example: make htmldocs . Consider using this mechanism, in case you want to document something kernel related yourself.
[1] | The difference between the two is that file operations deal with the file itself, and inode operations deal with ways of referencing the file, such as creating links to it. |