【发布时间】:2014-08-05 01:43:24
【问题描述】:
我正在尝试使用 proc 文件系统将数据从 linux 内核模块函数写入用户空间。我想使用seq_file 迭代实现,以便它处理页面大小和所有这些好东西。我有一个不断记录数据并创建结构并用数据填充结构的函数。我想将这些结构泵送到proc 文件系统,以便用户空间中的应用程序可以获取这些结构并适当地处理它们。当用户空间准备好接收数据时,它将从 proc 文件系统读取数据,这将启动所有这些。我在想我不能将结构传递给seq_file show 函数。那么我可以全局声明结构并将其从seq_show 函数打印到/proc/info 文件吗?下面我目前正在尝试实现。
typedef struct data_t{
unint32_t address;
unint8_t pid;
unint8_t info;
} data_t;
data_t data = NULL;
static void datalog(uint32_t addy, unint8_t info){
// this function is constantly logging data
data->address = addy;
data->info = info;
}
static void *seq_start(struct seq_file *s, loff_t *pos)
{
// seq file start stuff
}
static int seq_show(struct seq_file *s, void *v)
{
//print the data struct to the /proc/info file
return 0;
}
static void *seq_next(struct seq_file *s, void *v, loff_t *pos)
{
// move the pointer along
return v;
}
static void seq_stop(struct seq_file *s, void *v)
{
}
static struct seq_operations seq_ops = {
.start = seq_start,
.next = seq_next,
.stop = seq_stop,
.show = seq_show
};
static int open(struct inode *inode, struct file *file)
{
return seq_open(file, &seq_ops);
};
static struct file_operations fops = {
.owner = THIS_MODULE,
.open = open,
.read = seq_read,
.llseek = seq_lseek,
.release = seq_release
};
static int init(void)
{
struct proc_dir_entry *entry = NULL;
entry = proc_create("info", 0777, NULL, &fops);
data = (data_t *) kmalloc(sizeof(data_t), GFP_KERNEL);
return 0;
}
所以datalog 函数已经处于一个恒定循环中。我想将所有这些结构泵入/proc/info 文件,以便可以在用户空间中适当地处理它们。这将是快速的数据,所以感觉copy_to_user 不是要走的路。如您所见,我不确定我在做什么,因此非常感谢任何方向或帮助!谢谢!
【问题讨论】:
-
procfs旨在用于很少访问的文本数据。你为什么用它? -
CL 我的朋友,我想用它从内核空间获取日志信息到用户空间应用程序。谢谢!
-
有关日志记录的更多信息会有所帮助。你在哪里登录?您是否在维护包含 data_t 结构的日志缓冲区?另外,你在读取proc文件时想要所有的日志信息还是只想要未读的信息?
-
感谢您的帮助!我正在记录有关特定进程的信息,例如 EIP、寄存器等。所以你可以想象它正在迅速变化,我想将此信息转储到 proc 文件系统,以便我的用户空间应用程序可以处理它。我只想要未读的信息。
标签: c linux struct linux-kernel