3

我有 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)。它创建名称为时间戳(t1)的文件,并在其中写入一些信息。之后 1.so 调用 2.so(func_printer) 并创建另一个带有时间戳的文件。

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

4

1 回答 1

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);
}
于 2012-10-05T14:23:48.120 回答