2017-01-29 66 views
0

我有我认为是共享库似乎不共享。在第二个进程中,共享整数soShared应该是2。相反,对于程序的两个实例,我都会得到1的值。有三个部分在该示例中,共享库头,slc.h:linux共享c库不共享

#pragma once 
extern volatile int soShared; 

共享库本身,slc.c:

int soShared = 0; 

和使用共享资源的程序:

#include <unistd.h> 
#include <stdio.h> 
#include "slc.h" 

int main() { 
    int value = 0; 
    ++soShared; 
    for (;;) { 
    if (value != soShared) { 
     value = soShared; 
     printf("pid=%d, value=%d\n",getpid(),value); 
    } 
    sleep(1); 
    } 
    return 0; 
} 

这些编译和

gcc -c -fPIC -o slc.o slc.c 
gcc -shared -o libslc.so slc.o 
gcc -o use_slc use_slc.c libslc.so 
LD_LIBRARY_PATH=`pwd` ./use_slc & 
sleep 1 
LD_LIBRARY_PATH=`pwd` ./use_slc & 
运行两次

但是输出soShared的值为1;他们不共享。 (A)有人解释为什么第二次使用libslc.so的值不是2,(B)如何让资源共享这两个进程实际共享的资源?

回答

2

你只是误解了共享库的含义。这意味着一个常见的磁盘上和内存中的部分库保持其磁盘上的内容不变,库的副本将用于链接到它的所有程序。这并不意味着使用该库的所有程序/程序实例共享公用数据。这对于安全和一般的bugginess来说是一场噩梦,而那些表现出这种方式的图书馆将不会将静态链接作为一个符合C标准的实现。

顺便提一下,Win16上的DLL确实按照您想象的方式工作。这是一个很大的错误,也是Win32中发生的重大变化之一。

+0

要重申R ..所说的,.so在运行时加载的文件只是在某些位移中放入.TEXT段的代码。此代码在运行时被复制到每个进程中,但在编译时不会打包到二进制文件中。您希望在使用某种同步构造的共享内存可以完成的进程之间共享某些变量。 – Anirudh