我认为这是一个看似不共享的共享库。在第二个进程中,共享整数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实际上在两个进程之间共享?
答案 0 :(得分:2)
您只是误解了共享库的含义。它意味着磁盘上的常见磁盘和内存,磁盘上的内容保持不变,库的副本将用于链接到它的所有程序。这并不意味着使用该库的所有程序/程序实例共享公共数据。这对于安全性和一般性的bugginess来说是一场噩梦,而那种表现那种方式的库不能代表静态链接作为一致的C实现。
顺便说一句,Win16上的DLL确实以您想象的方式工作。这是一个很大的错误,也是Win32中的一个重大变化。