我有一个用C编写的服务器和客户端。我尝试在服务器中加载一个共享库,然后将库函数指针传递给客户端。这样我就可以更改库而无需编译客户端。
由于每个进程都有自己独立的内存空间,我想知道是否可以在共享内存上加载共享库,传递函数指针并映射客户端上的共享内存,然后让客户端执行代码服务器加载的库。
答案 0 :(得分:4)
根据定义,共享库是共享的,因此两个进程将为库的代码段使用相同的物理内存。因此,您可以将库的名称和函数从服务器传递到客户端,而不是编制一些狡猾的方案,客户端将使用dlopen()
+ dlsym()
获取函数地址。
请注意,在这种情况下,将有两个数据段副本(如果库具有一些全局或静态变量),例如如果服务器在库函数中设置了一些static
变量,那么客户端的值就不会改变。
答案 1 :(得分:0)
或许,如果操作系统不调用共享内存也可以执行安全问题(可能应该这样做)。
但你不需要。并且,您不应该将指针传递给其他进程。而是在协议中提供函数名称或代码点。共享库机制意味着内存中只有一个库副本,除非操作系统因某种原因决定不共享。如果操作系统决定不共享,那么可能的原因通常会导致指针传递技巧失败。