我有一个必须通过调用从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...


其中前奏是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


helpversion调用wrok可以正常工作,并且在Windows上可以正常读取,这是我的linux构建所特有的,但是到目前为止我还找不到错误。怎么称这个read像这样无限循环地运行?

最佳答案

read函数是在libc.so中定义的,用于读取数据。

sqlite3_open()极有可能调用它。

通过引入自己的名为read()的函数,您使程序进入了无限循环。如果等待足够长的时间,程序将耗尽堆栈并崩溃。

医生,我这样做会很痛。好吧,不要那样做:-)

关于c - 被调用的库过程在gnu/linux上以无限循环运行,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13468397/

10-17 03:11