2017-01-29 8 views
0

У меня есть то, что я считал разделяемой библиотекой, которая, как представляется, не используется совместно. Общее целое число 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 фактически разделенным между двумя процессами?

ответ

2

Вы просто не понимаете, что означают общие библиотеки. Это означает, что общий на диске и в памяти для частей библиотеки, которые остаются неизменными от их содержимого на диске, копия библиотеки используется для всех связанных с ней программ. Это не означает, что все программы/экземпляры программ, использующие библиотеку, имеют общие данные. Это был бы кошмар для безопасности и общей жестокости, а библиотеки, которые вели себя таким образом, не будут служить для статической привязки в качестве соответствующей реализации C.

Служащие DLL на Win16 действительно работали так, как вы предполагали. Это была большая ошибка и одна из основных изменений, внесенных в Win32.

+0

Чтобы повторить то, что сказал R .., файлы .so, загруженные во время выполнения, являются кодом, который помещается в ваш сегмент .TEXT при некотором перемещении. Этот код копируется в каждый процесс во время выполнения, но не накапливается в двоичный файл во время выполнения. Вы хотите поделиться некоторой переменной между процессами, которые могут быть выполнены с помощью общей памяти, используя некоторую конструкцию синхронизации. – Anirudh

 Смежные вопросы

  • Нет связанных вопросов^_^