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 に答える