Повторное открытие базы данных BerkeleyDB вызывает ошибку сегментации - PullRequest
0 голосов
/ 15 сентября 2011

В следующей программе я

  • открыть среду BDB
  • открыть базу данных DB_BTREE / DB_CREATE
  • закрыть базу данных
  • повторно открыть базу данных как DB_UNKNOWN / DB_RDONLY ...

но возникает ошибка сегментации.

Program received signal SIGSEGV, Segmentation fault.
0x00000000004008e4 in main (argc=2, argv=0x7fffffffe888) at testbdb.c:38
38                  if ((ret = dbp1->open(dbp1,

почему?

код:

#include <stdio.h>
#include <stdlib.h>
#include <db.h>



int main(int argc,char** argv)
    {
    DB_ENV *dbenv=NULL;
        DB *dbp1=NULL;
        int ret;
        int i;
        if(argc!=2) return -1;

        if ((ret = db_env_create(&dbenv, 0)) != 0) {
            fprintf(stderr, "%s: %s\n", argv[0], db_strerror(ret));
            exit(-1);
        }


        if ((ret =
            dbenv->open(dbenv, argv[1], DB_CREATE | DB_INIT_MPOOL, 0)) != 0) {
            dbenv->err(dbenv, ret, "environment open: %s", argv[1]);
            exit(-1);
        }


        if ((ret = db_create(&dbp1, dbenv, 0)) != 0) {
            dbenv->err(dbenv, ret, "database create");
            exit(-1);
        }
        for( i=0;i<2;++i)
                {
                printf("open i=%d\n",i);
                if ((ret = dbp1->open(dbp1,
                        NULL,
                        "database1", "database1",
                        (i==0?DB_BTREE:DB_UNKNOWN),
                        (i==0?DB_CREATE:DB_RDONLY),
                        0)) != 0) {
                    dbenv->err(dbenv, ret, "DB->open: database1");
                     exit(-1);
                    }

                dbp1->close(dbp1, 0);
                printf("close i=%d\n",i);
                }


    (void)dbenv->close(dbenv, 0);
    return 0;
    }

1 Ответ

0 голосов
/ 15 сентября 2011

В соответствии с документацией функции close ()"Дескриптор БД может быть недоступен после вызова DB-> close ()", что и делает ваш цикл.Это, вероятно, хорошее место, чтобы начать искать.

...