我有两个模块A,B .A有一个全局可访问的函数f(),即f()符号被导出。 B可能偶尔想要调用f()。但是如果加载了模块A,B应该只调用f()。 B判断A是否加载的最佳方法是什么?
这个问题的b部分是否有办法检查f()是否被导出?
我不确定哪种方法更有效。
答案 0 :(得分:1)
我假设您首先加载模块B,然后选择加载模块A.我的策略是在A首次初始化时让A寄存器与B一起使用一组函数。 B保持静态分配的函数指针(或指向充满函数指针的结构的指针),并提供导出的函数来注册和取消注册处理程序。当A加载时,它将其函数(或函数结构)注册到B.当A卸载时,它会注销其函数。
它可能会是这样的:
B.h
typedef int (*foo_t)(int);
int B_register_foo(foo_t);
int B_unregister_foo(foo_t);
B.c
static foo_t foo = NULL;
int B_register_foo(foo_t f) {
if (!foo) {
foo = f;
return 0;
}
return -EFOO;
}
void B_unregister_foo(foo_t f) {
if (foo == f)
foo = NULL;
}
EXPORT_SYMBOL(B_register_foo);
EXPORT_SYMBOL(B_unregister_foo);
void B_maybe_call_foo(int arg) {
return (foo) ? foo(arg) : 0;
}
A.C
static int A_foo(int arg);
static int __init init_A(void) {
if (B_register_foo(A_foo))
return -EFOO;
return 0;
}
static void __exit exit_A(void) {
B_unregister_foo(A_foo);
}
答案 1 :(得分:0)
如果B使用A的至少一个符号,那么在加载B时,提供所需符号的模块(换句话说,像A这样的模块)也已加载。
这个问题的b部分是否有办法检查f()是否被导出?
如果符号不可用,您将无法加载请求它的模块(B)。