Виртуальная файловая система уровня ядра Linux
Файловая система уровня ядра, отражающая процессы актуальных пользователей.
Каждый пользователь представляется каталогом, в котором присутствуют файлы с именами — идентификаторами процессов. Удаление файла должно приводить к эквиваленту отправки процессу сигнала SIGKILL (для UNIX) или вызову аналога TerminateProcess (для Windows). Файлы можно представлять пустыми (без содержания). Если все процессы пользователя прекращают свою работу, то соответствующий каталог может оставаться. Однако заранее каталоги создаваться не должны.
Речь о виртуальной файловой системе, не существующей на каком-либо диске. Как procfs.
Пример, можно доработать:
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/slab.h>
#include <linux/uaccess.h>
#include <linux/list.h>
#include <linux/init.h>
#include <linux/sched.h>
#include <linux/signal.h>
#define MODULE_NAME "procfs_user"
#define BASE_DIR "proc_user"
// Структура для хранения информации о процессе
struct proc_info {
pid_t pid;
char name[32];
struct list_head list;
};
// Структура для хранения пользователей
struct user_info {
char username[32];
struct list_head proc_list;
struct list_head list;
};
static LIST_HEAD(user_list);
static struct dentry proc_dir;
// Функция для завершения процесса
void kill_process(pid_t pid) {
struct task_struct task = pid_task(find_vpid(pid), PIDTYPE_PID);
if (task) {
send_sig(SIGKILL, task, 0);
}
}
// Функция для удаления файла
static ssize_t procfs_remove(struct file *file) {
// Получаем pid из имени файла
pid_t pid = simple_strtol(file->f_path.dentry->d_name.name, NULL, 10);
// Удаляем процесс
kill_process(pid);
return 0;
}
// Операции файловой системы
static const struct file_operations proc_fops = {
.owner = THIS_MODULE,
.release = procfs_remove,
};
// Функция, вызываемая при создании расположения
static int __init procfs_init(void) {
proc_dir = debugfs_create_dir(BASE_DIR, NULL);
if (!proc_dir) {
return -ENOMEM;
}
// Тут можно добавить логику для обхода всех процессов и создания файлов в proc_dir
return 0;
}
// Функция, вызываемая при выгрузке модуля
static void __exit procfs_exit(void) {
debugfs_remove(proc_dir);
// Освобождение ресурсов
}
module_init(procfs_init);
module_exit(procfs_exit);
MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("Kernel module to represent user processes in a virtual file system");
MODULE_AUTHOR("Expert");
Каждый пользователь представляется каталогом, в котором присутствуют файлы с именами — идентификаторами процессов. Удаление файла должно приводить к эквиваленту отправки процессу сигнала SIGKILL (для UNIX) или вызову аналога TerminateProcess (для Windows). Файлы можно представлять пустыми (без содержания). Если все процессы пользователя прекращают свою работу, то соответствующий каталог может оставаться. Однако заранее каталоги создаваться не должны.
Речь о виртуальной файловой системе, не существующей на каком-либо диске. Как procfs.
Пример, можно доработать:
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/slab.h>
#include <linux/uaccess.h>
#include <linux/list.h>
#include <linux/init.h>
#include <linux/sched.h>
#include <linux/signal.h>
#define MODULE_NAME "procfs_user"
#define BASE_DIR "proc_user"
// Структура для хранения информации о процессе
struct proc_info {
pid_t pid;
char name[32];
struct list_head list;
};
// Структура для хранения пользователей
struct user_info {
char username[32];
struct list_head proc_list;
struct list_head list;
};
static LIST_HEAD(user_list);
static struct dentry proc_dir;
// Функция для завершения процесса
void kill_process(pid_t pid) {
struct task_struct task = pid_task(find_vpid(pid), PIDTYPE_PID);
if (task) {
send_sig(SIGKILL, task, 0);
}
}
// Функция для удаления файла
static ssize_t procfs_remove(struct file *file) {
// Получаем pid из имени файла
pid_t pid = simple_strtol(file->f_path.dentry->d_name.name, NULL, 10);
// Удаляем процесс
kill_process(pid);
return 0;
}
// Операции файловой системы
static const struct file_operations proc_fops = {
.owner = THIS_MODULE,
.release = procfs_remove,
};
// Функция, вызываемая при создании расположения
static int __init procfs_init(void) {
proc_dir = debugfs_create_dir(BASE_DIR, NULL);
if (!proc_dir) {
return -ENOMEM;
}
// Тут можно добавить логику для обхода всех процессов и создания файлов в proc_dir
return 0;
}
// Функция, вызываемая при выгрузке модуля
static void __exit procfs_exit(void) {
debugfs_remove(proc_dir);
// Освобождение ресурсов
}
module_init(procfs_init);
module_exit(procfs_exit);
MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("Kernel module to represent user processes in a virtual file system");
MODULE_AUTHOR("Expert");