Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.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 - Fatal编程技术网

具有两个应用程序的C语言共享库

具有两个应用程序的C语言共享库,c,C,对于两个应用程序之间的共享库,每个应用程序是否在运行时使用自己的库副本?如果它们使用库的同一实例,库中的全局变量会发生什么变化?每个程序都会在自己的内存空间中创建库的新实例。它们不共享,两个程序不会看到彼此的数据 看看动态库是如何加载的: 静态链接库也是如此,只是它们不是在运行时加载,而是在编译时链接。这取决于操作系统。在大多数类Unix系统上,共享库使用位置无关的代码,因此代码段(包含指令和只读变量)使用的内存可以在进程之间共享,但每个进程仍有自己的数据段(包含其他变量)。对于类Unix操作系

对于两个应用程序之间的共享库,每个应用程序是否在运行时使用自己的库副本?如果它们使用库的同一实例,库中的全局变量会发生什么变化?

每个程序都会在自己的内存空间中创建库的新实例。它们不共享,两个程序不会看到彼此的数据

看看动态库是如何加载的:


静态链接库也是如此,只是它们不是在运行时加载,而是在编译时链接。

这取决于操作系统。在大多数类Unix系统上,共享库使用位置无关的代码,因此代码段(包含指令和只读变量)使用的内存可以在进程之间共享,但每个进程仍有自己的数据段(包含其他变量)。

对于类Unix操作系统,当您第一次执行应用程序时,映射库地址空间的两个进程的页表将指向内存中加载库的相同帧


但是,映射库的数据部分的页表是通过
Copy-on-Write
机制处理的。一旦您尝试写入全局变量,操作系统将创建包含该变量的页面的流程特定副本,并相应地重新映射该流程的页面表。

这取决于库的共享方式、操作系统等。但通常对于普通系统,对于单独的进程,则存在无法共享数据的单独实例,除非它们明确采取步骤,例如使用内存映射。谢谢您的回答。您是否有进一步阅读的参考资料?@sansuiso本书不深入探讨内存的细节,但提供了现代UNIX系统的内存布局:UNIX环境中的高级编程第3版第206页:共享库从可执行文件中删除公共库例程,而不是在内存中所有进程引用的某个位置保留库例程的单个副本。这减少了每个可执行文件的大小,但可能会增加一些运行时开销,无论是在第一次执行程序时还是在第一次调用每个共享库函数时通常在多个进程之间共享,只有每个进程的数据部分是新创建的。也可以从您提到的同一个博客中查看。我认为从我读到的所有答案来看,他们共享文本部分,这意味着他们不使用两个不同的实例,我同意with@dfj因此,因为它是最古老的答案,我会考虑它。ith@djf comment作为我问题的答案。是的,你们是对的。我回答的问题是,在没有某种进程间通信的情况下,程序是否会看到彼此的数据。