2017-01-29 270 views
0

我有我認爲是共享庫似乎不共享。在第二個進程中,共享整數soShared應該是2。相反,對於程序的兩個實例,我都會得到1的值。有三個部分在該示例中,共享庫頭,slc.h:linux共享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)如何讓資源共享這兩個進程實際共享的資源?

回答

2

你只是誤解了共享庫的含義。這意味着一個常見的磁盤上和內存中的部分庫保持其磁盤上的內容不變,庫的副本將用於鏈接到它的所有程序。這並不意味着使用該庫的所有程序/程序實例共享公用數據。這對於安全和一般的bugginess來說是一場噩夢,而那些表現出這種方式的圖書館將不會將靜態鏈接作爲一個符合C標準的實現。

順便提一下,Win16上的DLL確實按照您想象的方式工作。這是一個很大的錯誤,也是Win32中發生的重大變化之一。

+0

要重申R ..所說的,.so在運行時加載的文件只是在某些位移中放入.TEXT段的代碼。此代碼在運行時被複制到每個進程中,但在編譯時不會打包到二進制文件中。您希望在使用某種同步構造的共享內存可以完成的進程之間共享某些變量。 – Anirudh