Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <linux/module.h>
- #include <linux/kernel.h>
- #include <linux/proc_fs.h>
- #include <linux/uaccess.h>
- #define PROCFS_MAX_SIZE 1024
- #define PROCFS_NAME "test1"
- static struct proc_dir_entry *Our_Proc_File;
- static char procfs_buffer[PROCFS_MAX_SIZE];
- static unsigned long procfs_buffer_size = 0;
- static int Device_Open = 0;
- // Обработчик чтения из файла в /proc.
- ssize_t procfile_read(struct file *filePointer,char *buffer, size_t buffer_len$
- {
- if (*offset >= sizeof(procfs_buffer)) return 0;
- copy_to_user(buffer, procfs_buffer, sizeof(procfs_buffer));
- *offset += buffer_length;
- printk(KERN_INFO "leaving /proc/test : procfile_read, wrote %d Bytes\n",(i$
- return buffer_length;
- }
- static ssize_t procfile_write(struct file *file, const char *buff,
- size_t length, loff_t *offset)
- {
- procfs_buffer_size = length;
- if (procfs_buffer_size > PROCFS_MAX_SIZE)
- procfs_buffer_size = PROCFS_MAX_SIZE;
- memset(procfs_buffer, 0, sizeof(procfs_buffer));
- if (copy_from_user(procfs_buffer, buff, procfs_buffer_size))
- return -EFAULT;
- procfs_buffer[procfs_buffer_size] = '\0';
- printk(KERN_INFO "leaving /proc/test : procfile_write, %s \n", procfs$
- return procfs_buffer_size;
- }
- static int procfile_open(struct inode *inode, struct file *file)
- {
- static int counter = 1;
- if (Device_Open) return -EBUSY;
- Device_Open++;
- printk(KERN_INFO "procfile_was_opened\n");
- return 0;
- }
- static int procfile_release(struct inode *inode, struct file *file)
- {
- printk("Released.\n");
- Device_Open--; /* Теперь мы готовы обслужить другой процесс */
- // Уменьшить счетчик обращений, иначе, после первой же удачной попытки открыть$
- return 0;
- }
- static const struct file_operations proc_fops = {
- .owner = THIS_MODULE,
- .read = procfile_read,
- .write = procfile_write,
- .open = procfile_open,
- .release = procfile_release,
- };
- int init_module()
- {
- int rv = 0;
- printk(KERN_INFO "Trying to create /proc/test:\n");
- Our_Proc_File = proc_create(PROCFS_NAME, 0644, NULL, &proc_fops);
- if (Our_Proc_File == NULL) {
- rv = -ENOMEM;
- proc_remove(Our_Proc_File);
- printk(KERN_INFO "Error: Could not initialize /proc/test\n");
- }
- else {
- printk(KERN_INFO "Success!\n");
- }
- return rv;
- }
- void cleanup_module()
- {
- proc_remove(Our_Proc_File);
- printk(KERN_INFO "/proc/test removed\n");
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement