LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1275|回复: 9

链接库中的静态变量

[复制链接]
发表于 2006-1-12 12:21:51 | 显示全部楼层 |阅读模式
现在有多个程序都使用同一个链接库,而链接库中有一个静态变量作为累加的,那些程序里面取得的值要求不会重复。不知道怎么表达才好

dllfct.h

#ifndef _DLLFCT_H__
#define _DLLFCT_H__

#ifndef EXPORT
#ifdef BUILD_DLL
#define EXPORT __declspec(dllexport)
#else
#define EXPORT __declspec(dllimport)
#endif        // #ifdef BUILD_DLL
#endif        // #ifndef EXPORT

EXPORT int getSeq(void);

#endif        // #ifndef _DLLFCT_H__


dllfct.c

#include <stdio.h>

#include "dllfct.h"

static int a = 0xAB;

EXPORT int getSeq(void)
{
        return a++;
}


hello.c

#include <stdio.h>

#include "dllfct.h"

int main(void)
{
        char k = '\0';

        while (k != 'q')
        {
                printf("static value is: [%d]", getSeq());
                k = getchar();
        }

        return 0;
}


编译:
gcc -c -DBUILD_DLL dllfct.c
gcc -shared -otst.dll -Wl,--out-implib,libtstdll.a dllfct.o
gcc -c -ohello.o hello.c
gcc -ohello.exe hello.o -L./ -ltstdll


然后同时运行多个hello.exe,但是每个程序所取得的值都是一样的。是不是我对链接库的理解错了?
发表于 2006-1-12 12:44:21 | 显示全部楼层
还不如把这个值放在一个文件里,每次都去读写这个文件
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-1-12 12:56:57 | 显示全部楼层
我也有想过!但是这函数将会非常频繁地调用,每次取值后都保存一下文件,我担心影响效率。
回复 支持 反对

使用道具 举报

发表于 2006-1-12 13:09:57 | 显示全部楼层
使用ramfs呢? 效率应该会好点吧
回复 支持 反对

使用道具 举报

发表于 2006-1-12 17:15:45 | 显示全部楼层
Post by waa
我也有想过!但是这函数将会非常频繁地调用,每次取值后都保存一下文件,我担心影响效率。

可以考虑mmap
回复 支持 反对

使用道具 举报

发表于 2006-1-12 17:53:25 | 显示全部楼层
库在连接后就成了一个可执行程序的一部分
进程,作为执行中的可执行程序,其地址空间是彼此独立的

在具体实现上
库的代码段和只读数据段确实是共享的,其他不共享

或者用shared memory呢
回复 支持 反对

使用道具 举报

发表于 2006-1-14 20:57:37 | 显示全部楼层
你的理解还是有一定偏差的,虽然动态链接库(DLL)在被不同的程序load的时候,使用的都是相同的代码,但是Window加载DLL和普通程序一样,使用了一个WriteOnCopy机制,就是当对当前进程的地址空间进行“读取”和“执行”操作的时候,使用的是相同的内存映射,当程序对内存进行“写”操作的时候,Windows就会把你要操作的那块内存“复制”到另一个区域,所以你改的内存只是对应于当前进程,而不会影响其他的进程,至于你的想法,在Windows中使用楼上所说的“共享”段来实现的,具体可以参照MSDN中,关于DLL的描述!


Post by waa
现在有多个程序都使用同一个链接库,而链接库中有一个静态变量作为累加的,那些程序里面取得的值要求不会重复。不知道怎么表达才好

dllfct.h

#ifndef _DLLFCT_H__
#define _DLLFCT_H__

#ifndef EXPORT
#ifdef BUILD_DLL
#define EXPORT __declspec(dllexport)
#else
#define EXPORT __declspec(dllimport)
#endif        // #ifdef BUILD_DLL
#endif        // #ifndef EXPORT

EXPORT int getSeq(void);

#endif        // #ifndef _DLLFCT_H__


dllfct.c

#include <stdio.h>

#include "dllfct.h"

static int a = 0xAB;

EXPORT int getSeq(void)
{
        return a++;
}


hello.c

#include <stdio.h>

#include "dllfct.h"

int main(void)
{
        char k = '\0';

        while (k != 'q')
        {
                printf("static value is: [%d]", getSeq());
                k = getchar();
        }

        return 0;
}


编译:
gcc -c -DBUILD_DLL dllfct.c
gcc -shared -otst.dll -Wl,--out-implib,libtstdll.a dllfct.o
gcc -c -ohello.o hello.c
gcc -ohello.exe hello.o -L./ -ltstdll


然后同时运行多个hello.exe,但是每个程序所取得的值都是一样的。是不是我对链接库的理解错了?
回复 支持 反对

使用道具 举报

发表于 2006-1-16 09:19:17 | 显示全部楼层
Post by ooio_karl
你的理解还是有一定偏差的,虽然动态链接库(DLL)在被不同的程序load的时候,使用的都是相同的代码,但是Window加载DLL和普通程序一样,使用了一个WriteOnCopy机制,就是当对当前进程的地址空间进行“读取”和“执行”操作的时候,使用的是相同的内存映射,当程序对内存进行“写”操作的时候,Windows就会把你要操作的那块内存“复制”到另一个区域,所以你改的内存只是对应于当前进程,而不会影响其他的进程,至于你的想法,在Windows中使用楼上所说的“共享”段来实现的,具体可以参照MSDN中,关于DLL的描述!

WriteOnCopy??!
应该是copy on write吧。
回复 支持 反对

使用道具 举报

发表于 2006-1-16 10:52:45 | 显示全部楼层
Post by kj501
WriteOnCopy??!
应该是copy on write吧。


呵呵,好久没碰windows了,记不清了,
反正就是那意思!!!
回复 支持 反对

使用道具 举报

发表于 2006-1-16 17:23:14 | 显示全部楼层
share memory
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表