繁体   English   中英

linux共享的c库不共享

[英]linux shared c library not shared

我以为是一个似乎不共享的共享库。 在第二个过程中,共享整数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资源实际上在两个进程之间共享?

您只是误解了共享库的含义。 这意味着,对于磁盘上的内容与其在磁盘上的内容保持不变的部分,在磁盘上是公用的,并且在内存中,该库的副本将用于与其链接的所有程序。 这并不意味着使用该库的所有程序/程序实例都共享公共数据。 这将是安全性和一般错误的噩梦,以这种方式运行的库将无法代替静态链接作为符合标准的C实现。

顺便说一句,Win16上的DLL确实按照您的想象工作。 这是一个大错误,是Win32中的主要更改之一。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM