linux共享c库没有共享

时间:2017-01-29 02:50:40

标签: c linux shared-libraries

我认为这是一个看似不共享的共享库。在第二个进程中,共享整数soShared应为2。相反,我为程序的两个实例获得值1。这个例子中有三个部分,共享库头,slc.h:

#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)如何使资源soShared实际上在两个进程之间共享?

1 个答案:

答案 0 :(得分:2)

您只是误解了共享库的含义。它意味着磁盘上的常见磁盘和内存,磁盘上的内容保持不变,库的副本将用于链接到它的所有程序。这并不意味着使用该库的所有程序/程序实例共享公共数据。这对于安全性和一般性的bugginess来说是一场噩梦,而那种表现那种方式的库不能代表静态链接作为一致的C实现。

顺便说一句,Win16上的DLL确实以您想象的方式工作。这是一个很大的错误,也是Win32中的一个重大变化。