Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C中注册回调函数_C_Callback_Kernel_Space - Fatal编程技术网

在C中注册回调函数

在C中注册回调函数,c,callback,kernel,space,C,Callback,Kernel,Space,我是一些Linux内核空间代码。我希望用户空间中的应用程序能够通过调用内核空间代码中的函数并传递回调函数的地址,在内核空间代码中注册回调函数。内核空间代码将在稍后运行时执行回调函数。我认为内核空间代码应该是这样的: typedef void (*callback_func) (void); callback_func callback; static void registerCallBack(callback_func funct){callback = funct;} //another

我是一些Linux内核空间代码。我希望用户空间中的应用程序能够通过调用内核空间代码中的函数并传递回调函数的地址,在内核空间代码中注册回调函数。内核空间代码将在稍后运行时执行回调函数。我认为内核空间代码应该是这样的:

typedef void (*callback_func) (void);
callback_func callback;

static void registerCallBack(callback_func funct){callback = funct;}

//another kernel space method
funct();

但是,我有点不确定正确的typedef以及它是否能正常工作。是否有人可以确认此功能或在这方面提供任何建议?我现在无法测试这一点,因为我正在等待内核空间代码的其余部分完成。

您的
typedef
看起来不错,不过我建议将
callback\u func
重命名为类似
callback\u func\t
,否则它看起来像一个变量而不是一个类型。

您不能直接从内核调用用户空间函数。一个可能的解决办法是使用。您可以从内核代码向给定进程发送信号。然后,信号处理程序将作为一种回调函数来工作。

如果您只是想从内核运行用户空间应用程序,请详细描述如何执行该操作。

看起来有效。如果您不想传递任何参数,那么您甚至不会在ABI上遇到麻烦。我很确定在某个时候它需要传递参数,但只是为了进行初步测试,以验证它是否能与printk语句一起工作,现在没有一个是通过的。我不确定您是否可以从内核内部简单地调用userspace函数。你必须保证你已经加载了给你函数的同一个进程的地址空间,并且你可能必须关心指针的内存页是否被实际加载。撇开空间问题不谈,让用户在内核空间中运行任意代码是完全不安全的。这最终将通过一个用户可以在其中调用函数的库来实现。我只需要一种从用户空间代码中保存函数地址的方法,以便内核代码以后可以运行此函数。这不保存该函数的地址吗?我想我需要删除静态声明才能调用此函数。静态声明只与可见性有关,而与可访问性无关。如果你有一个指向静态函数的指针,你可以调用它——如果你在相同的进程中,在用户模式下内核不能这样做(或者至少会很奇怪,需要很多黑客才能做到)。用户空间代码将函数的地址发送到内核代码是否也需要这样做,您正在开发一个内核模块,您可以使用一个虚拟文件来发送和接收内核中的数据。那么设备驱动程序呢?我想我应该特别提到我在内核空间中所做的事情。你能理解如果你把一个函数的地址发送到另一个进程,并尝试调用它会发生什么吗?你理解@user1061166的概念吗?是的,我猜你正在使用内核模块作为设备驱动程序。您能否提供更多关于您希望在用户空间和内核空间之间进行何种类型的交互的详细信息?