gpt4 book ai didi

c - linux共享c库不共享

转载 作者:太空宇宙 更新时间:2023-11-04 08:07:18 26 4
gpt4 key购买 nike

我有一个我认为是共享库的东西,它似乎没有被共享。共享整数 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 在两个进程之间实际共享?

最佳答案

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

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

关于c - linux共享c库不共享,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41917173/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com