C Linux内核线程:如何将Linux模块写入函数作为线程必须执行的函数传递?

C Linux内核线程:如何将Linux模块写入函数作为线程必须执行的函数传递?,c,multithreading,linux-kernel,linux-device-driver,kernel-module,C,Multithreading,Linux Kernel,Linux Device Driver,Kernel Module,我正在开发与用户空间程序通信的Linux内核模块。此模块等待从用户空间发送的消息,以便在内核模式下打印它 这是模块: #include <linux/init.h> #include <linux/module.h> #include <linux/fs.h> #include <linux/device.h> #include <linux/kernel.h> #include <linux/uaccess.h> M

我正在开发与用户空间程序通信的Linux内核模块。此模块等待从用户空间发送的消息,以便在内核模式下打印它

这是模块:

#include <linux/init.h>
#include <linux/module.h>
#include <linux/fs.h>
#include <linux/device.h>  
#include <linux/kernel.h>
#include <linux/uaccess.h>

MODULE_LICENSE("GPL");      
MODULE_AUTHOR("Gaston");  
MODULE_DESCRIPTION("A simple Linux char driver"); 
MODULE_VERSION("0.1"); 

#define MAX 256
static char message[MAX] ="";      ///< Memory for the string that is passed from userspace

ssize_t exer_open(struct inode *pinode, struct file *pfile) {

    printk(KERN_INFO "Device has been opened\n");
    return 0;
}


ssize_t exer_read(struct file *pfile, char __user *buffer, size_t length, loff_t *offset) {

    return 0;
}


ssize_t exer_write(struct file *pfile, const char __user *buffer, size_t length, loff_t *offset) {
    if (length > MAX)
        return -EINVAL;

    if (copy_from_user(message, buffer, length) != 0)
        return -EFAULT;

    printk(KERN_INFO "Received %s characters from the user\n", message);
    return 0;

}   


ssize_t exer_close(struct inode *pinode, struct file *pfile) {

    printk(KERN_INFO "Device successfully closed\n");
    return 0;
}


struct file_operations exer_file_operations = { 
    .owner = THIS_MODULE,
    .open = exer_open,
    .read = exer_read,
    .write = exer_write,
    .release = exer_close,
};


int exer_simple_module_init(void) {

    printk(KERN_INFO "Initializing the LKM\n");
    register_chrdev(240, "Simple Char Drv", &exer_file_operations);
    return 0;
}


void exer_simple_module_exit(void) {

    unregister_chrdev(240, "Simple Char Drv");
}


module_init(exer_simple_module_init);
module_exit(exer_simple_module_exit);
此函数的第一个参数是线程必须执行的函数,另一个参数是
(void*data)
,但是,我的write内核函数的参数不同:

ssize_t exer_write(struct file *pfile, const char __user *buffer, size_t length, loff_t *offset)
请问有没有办法解决这个问题?如何修改我的Linux内核以作为线程执行
write
函数


谢谢。

你不能。线程函数必须使用以下格式:

int my_thread_function(void *data)
您可以随意调用它-它不必调用
my\u thread\u function
-参数也不必调用
data
,但它必须是
void*

这是行不通的:

ssize_t exer_write(struct file *pfile, const char __user *buffer, size_t length, loff_t *offset)
我建议编写一个新函数作为线程函数:

int exer_write_in_thread(void *data) {
    exer_write(???, ???, ???, ???);
    return 0;
}

显然,您必须弄清楚要使用哪些参数调用
exer\u write

要添加更多信息,您需要嵌入一个包含以下详细信息的结构或容器:file*pfile、const char\u user*buffer、size\t length、loff\u t*offset。从void指针(void*data)中检索这个数据,并将它们马歇尔化到写调用。仅当您希望将多个参数从
exer\u simple\u module\u init
传递到
exer\u write
int my_thread_function(void *data)
ssize_t exer_write(struct file *pfile, const char __user *buffer, size_t length, loff_t *offset)
int exer_write_in_thread(void *data) {
    exer_write(???, ???, ???, ???);
    return 0;
}