在库和程序之间共享变量

时间:2012-10-05 14:16:20

标签: c linux shared-libraries

我有2个共享库(让它们是1.so,2.so)和程序(a.out)。 2.so链接到1.so和a.out - 它有一些在1和a中使用的函数。

2.so的代码是

FILE *in;
char filename[128];
int func_printer(int a)
{
    if(strlen(filename)==0)
    {
       sprintf(filename,"%ld",time(NULL);
    }
    if((in=fopen(filename,"a"))==NULL)return;
    fprintf(in,"%i",a);
    fclose(in);
}

a.out有下一个

extern int func_printer(int);
extern void some_action();
int main()
{
    some_action();
    func_printer(2);
    return 0;
}

最后1.so有方法some_action

extern int func_printer(int);
void some_action()
{ 
    func_printer(1);
    printf("hello world");
    return;
}

所以当a.out启动时,它会调用1.so(some_action())并调用2.so(func_printer)。它创建名称为timestamp(t1)的文件,并在其中写入一些信息。之后1.so调用2.so(func_printer)并创建另一个带时间戳的文件。

在这种情况下是否有可能some_action始终写入t1,但是当程序再次启动时,它应该写入另一个文件。总而言之,当程序启动时,所有库都应该知道文件名在哪里写(没有像文件名那样硬预定文件名,如char * filename =“somefile.txt”;)?

1 个答案:

答案 0 :(得分:1)

似乎写入文件的唯一内容是2.so。只需暴露一个二传手:

char filename[128];

void set_filename(char * path) {
    strncpy(filename, sizeof(filename), path);
    filename[sizeof(filename) - 1] = '\0';
}

int func_printer(int a)
{
    FILE *in;
    if(strlen(filename)==0) {
       sprintf(filename,"%ld",time(NULL);
    }
    if((in=fopen(filename,"a"))==NULL)return;
    fprintf(in,"%i",a);
    fclose(in);
}