-1

呼び出して sqlite データベースからデータを読み取らなければならないライブラリがあります

extern int read(char** argv, int argc); // from header

以下を処理する必要があります。

int read(char** argv, int argc) {
    char* lineborder1;
    char* lineborder2;
    char* spaces1;
    char* spaces2;
    int maxl2 = 0, maxl1 = 0;
    int i, maxi1, maxi2;
    if (prelude() == -1) return -1;
    // etc...

ここで、prelude は sqlite 接続の内部プロシージャです。

int prelude() {
    timefile = 0;
    f = NULL;
#ifndef WIN32
    char* temp = (char*)calloc(200, sizeof(char));
#endif
    queries = (char**)malloc(sizeof(char*) * q_cnt);
    for (x = 0; x < q_cnt; x++) {
        queries[x] = (char*)malloc(sizeof(char) * q_size);
        }
#ifdef WIN32
    retval = sqlite3_open("todo.db3", &handle);
#else
    home = (char*)getenv("HOME");
    strcpy(temp, home);
    retval = sqlite3_open(strcat(temp, "/.todo.db3"), &handle);
    free(temp);
#endif
    if (retval) {
        printf("Database connection failed\n\r");
        return -1;
        }
    return 0;
    }

ソース全体はこちら: bitbucket: ctodo.c

私はこれをアプリケーションから読み取りと呼びます:

else if ((strcmp(argv[1], "read") == 0) || (strcmp(argv[1], "r") == 0)) {
    return read(argv, argc);

readしかし、この呼び出しの無限サイクルを取得します:

>>./todo r
Database connection failed
Database connection failed
Database connection failed
.... etc

ビルド方法は次のとおりです。

gcc -I . -c -o todo.a ctodo.c -lsqlite3 -O3
gcc -I . -o todo cctodo.c -lsqlite3 -O3 todo.a

helpまたはversion、wrok を正常に呼び出し、Windows で read が正常に動作します。私の Linux ビルドに固有のものはここにありますが、これまでのところバグは見つかりません。readそのような無限サイクルで実行するために、これを何と呼ぶことができますか?

4

1 に答える 1

2

このread関数は で定義されておりlibc.so、データの読み取りに使用されます。

sqlite3_open()と呼んでいる可能性が非常に高いです。

という独自の関数を導入するread()ことで、プログラムを無限ループに陥らせました。十分に長く待つと、プログラムはスタックを使い果たし、クラッシュします。

先生、そうすると痛いです。まあ、それをしないでください:-)

于 2012-11-20T07:39:53.117 に答える