程序A可以调用程序B内的函数吗?该如何解决

程序A可以调用程序B内的函数吗?
如题,详细描述:

有两个程序A和B,它们都使用了同一个动态库。

先运行程序A,程序A调用动态库中的 X函数 进行初始化,被初始化的是动态库中的一个全局变量,这个全局变量是个结构体,记录着某些有用的数据,如果 X函数 再次被调用,那么就对这个结构体中的成员变量的值进行修改。

在程序A里打开程序B,但不是直接调用system之类的函数运行这个程序,而是先创建一个线程,在这个线程内,使用某种方式,类似于dlopen函数和dlsym函数一样,打开程序B的可执行文件,获取函数指针,这个函数指针就是指向程序B的main函数;

程序B作为程序A的子线程运行,子线程中运行的程序B的main函数也会调用动态库中的 X函数 进行初始化,被调用两次的 X函数 所使用的是不是同一个全局变量?





主要是想实现多个进程间的变量共享,这个变量是一个结构体A,结构体A中有指针数组,指针数组中每个指针指向每个进程的结构体B,而结构体B中也有指针,指针由该进程使用的malloc之类的函数申请了不定量的内存空间,用于储存数据。
但是,网上搜索到的相关资料,有的是说多进程间不能共享指针,因为指针指向的内存空间是属于一个进程的,其它进程不能使用这个指针访问其它进程中的数据。

------解决方案--------------------
不是很懂 帮顶
------解决方案--------------------
理论是应该是同一个全局变量。
可以写两个程序验证一下!
------解决方案--------------------
当然可以 如果你编写的是c语言 你可以编写好一个.h文件的函数,把它放到c的.h目录下,然后用#include"yourself.h"进行引用
------解决方案--------------------
remote procedure call
------解决方案--------------------
我觉得不可以,每个进程都有自己的代码段、数据段和栈吧,这个代码段或许会重合(这个我不确定),但数据段、栈是不可能共享的,要不然这进程间通讯的机制是不是太儿戏了。
------解决方案--------------------
动态库里面的函数都是可以重定位的, 不知道main可不可以重定位, 如果可以, 理论上来说就和库里面的一样了

------解决方案--------------------
探讨

理论是应该是同一个全局变量。
可以写两个程序验证一下!

------解决方案--------------------
使用进程间通信(IPC),解决方案有很多种。
远程进程调用(remote procedure call)可以实现一个进程对另外一个进程数据读写,以下为远程进程调用需要用到的函数:
OpenProcess,VirtualAllocEx,WriteProcess,ReadProcessMemory,CreateRemoteThread
windows中有消息机制可以从一个程序通知另外一个程序信息。
但是所有的解决方案都需要对数据进行同步,CreateEvent,或者CreateMute可以实现多进程之间对同一数据同步。
以上。
------解决方案--------------------
探讨
引用:

引用:

理论是应该是同一个全局变量。
可以写两个程序验证一下!

看来不行,gcc -shared生成的动态库不能直接执行,但是不加-shared生成的执行文件用dlopen会失败。
不知道在Windows下可不可以。

那么,可不可以将 程序A 作为一个软件平台,而 程序B 就作为这个平台的一个软件,把……

------解决方案--------------------
肯定是不行的。

两个进程,其地址空间都是独立的,看变量名字相同,其内存地址可不一样的。
------解决方案--------------------
答复是很肯定的,不是同一个变量,只是同一套代码而已。正如你的一个程序运行两次,就相当于起了两个进程,这两个进程里的全局变量是没有关系的。进程之间通信还是需要使用IPC的。

IPC的方法很多,比如socket,命名管道,共享内存,消息队列,等等。
------解决方案--------------------
探讨
我表达的是:程序A 是一个进程,在程序A里调用程序B,程序A 会创建一个线程,在这个线程里,像调用动态库中的函数一样调用 程序B 中的main函数,由于全局变量可以在线程间共享,那么在线程中调用的函数应该也能使用 程序A 的进程中的全局变量。


------解决方案--------------------
探讨
但是,网上搜索到的相关资料,有的是说多进程间不能共享指针,因为指针指向的内存空间是属于一个进程的,其它进程不能使用这个指针访问其它进程中的数据。

------解决方案--------------------
除非设置共享数据段,否则,所有的动态链接库中的全局变量,都会自己的进程空间拷贝一份副本

也就是说,这这种情况下每个进程看到的全局变量,是互相独立的

对于*nix平台,共享数据段只有偶尔几个平台支持,对于windows平台,可以设置seg_share来实现。
------解决方案--------------------
不懂图形界面系统是怎么实现的。但我觉得肯定不是使用全局变量进行访问的。你想想看,数十个进程并发的访问同一个全局变量,来显示自己,这需要多强的一套冲突处理机制啊!

我觉得这样做简单一些。界面显示系统,提供绘制界面的服务,从一个固定的消息队列中接收消息,并根据消息的内容绘图;其他进程使用这种服务,把要绘制的内容组织成消息,放到消息队列中。
------解决方案--------------------