У меня есть то, что я считал разделяемой библиотекой, которая, как представляется, не используется совместно. Общее целое число soShared
должно быть 2 во втором процессе. Вместо этого я получаю значение 1 для обоих экземпляров программы. Есть три части в этом примере, заголовок разделяемой библиотеки, slc.h:linux shared 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), как можно сделать ресурс soShared фактически разделенным между двумя процессами?
Чтобы повторить то, что сказал R .., файлы .so, загруженные во время выполнения, являются кодом, который помещается в ваш сегмент .TEXT при некотором перемещении. Этот код копируется в каждый процесс во время выполнения, но не накапливается в двоичный файл во время выполнения. Вы хотите поделиться некоторой переменной между процессами, которые могут быть выполнены с помощью общей памяти, используя некоторую конструкцию синхронизации. – Anirudh