代码之家  ›  专栏  ›  技术社区  ›  Mark Galeck

如何最好地与动态加载的库共享一个全局主计算库?

  •  0
  • Mark Galeck  · 技术社区  · 6 年前

    main.c 用编译 gcc main.c common.o -o program :

    #define _GNU_SOURCE
    #include <unistd.h>
    #include <stdio.h>
    
    extern char **environ;
    
    extern int g_common;
    
    int main() {
        char *argv[2] = {"/bin/true", NULL};
    
        // SSCCE HACK: don't do this at home!
        // environ[0] is unimportant so we replace it
        environ[0] = "LD_PRELOAD=/tmp/foobar.so";
    
        g_common = 1;
        printf("main: g_common is %d\n", g_common);
    
        if (!fork())
            execve(*argv, argv, environ);
    }
    

    common.c 用编译 gcc -fPIC -rdynamic -c common.c

    int g_common;
    

    而迪诺图书馆

    foobar.c 用编译

    gcc -shared -fPIC -Wl,-init,init common.o foobar.c -o /tmp/foobar.so

    #include <stdio.h>
    
    extern int g_common;
    
    void init() {
        printf("foobar.so: g_common is %d\n", g_common);
    }
    

    基本上 program 我想计算一些东西,这里 g_common . 实际上,这是一个很长的计算,所以我只想做一次。

    这里它只是一个程序,但实际上有数千个,我不想重新计算 每一次的价值 init() 用于预加载库的函数。

    普通的

    好的,那么如何正确地做这个,所以我只计算 一次?

    1 回复  |  直到 6 年前
        1
  •  0
  •   Mark Galeck    6 年前

    我用乔纳森·莱弗勒的建议来使用共享记忆。我想把这个作为对未来新手的好处。

    所有的功劳都应该归功于乔纳森,而不是我。

    main() :

    int fd;
    fd = shm_open("g_common", O_CREAT | O_WRONLY, 
            S_IWUSR | S_IWGRP | S_IWOTH);
    write(fd, "foo", 4);
    

    foobar.c init() :

    int fd = shm_open("g_common", O_RDONLY, 0);
    void *bytes = mmap(NULL, 4, PROT_READ, MAP_SHARED, fd, 0 );
    printf("g_common is %s\n", (char *)bytes);
    

    当然了 common.c 不需要。