2011-09-15 6 views
0

を発生させ、I再オープンBerkeleyDBのデータベースは、以下のプログラムでセグメンテーションフォールト

  • 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; 
    } 
+0

2011年にバークレーDBで新しいコードを書いているのはなぜですか?最近、sqliteはまだ軽いですが、はるかに強力で、libdbmの設計上の欠陥や制限がありません。 –

+0

大きなデータ:-) http://www.sciencemag.org/content/331/6018.cover-expansion – Pierre

+1

私はBerkeley DBを "ビッグデータ"(またはそのデータについては...)として使うとは思わない。 –

答えて

0

documentation of the close() functionによると、あなたのループが何をしているかである「DBハンドルはDB-後に再度アクセスすることはできません>近い()が呼び出されます」。それはおそらく探し始めるのに良い場所です。

関連する問題