2012-05-09 3 views
0

У меня есть следующая программа, которая создает среду Berkeley DB.Ошибка Berkeley DB SIGBUS

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

int main() 
{ 
DB_ENV *env=NULL; 
DB* m_db=NULL; 

if(db_env_create(&env,0)==-1) printf("fail create\n"); 
env->set_lk_max_locks(env, 100000); 
env->set_lk_max_lockers(env, 100000); 
env->set_lk_max_objects(env, 100000); 

if(env->open(env,"/tmp/cc", DB_INIT_MPOOL | DB_INIT_CDB, 0)!=0) 
{ 
    printf("No env, creating one\n"); 
    if(env->open(env, "/tmp/cc", DB_CREATE | DB_INIT_MPOOL | DB_INIT_CDB, 0) == -1) 
     printf("Failed creating env\n"); 
} 

env->close(env,0); 

return 0; 
} 

Если вы удалите файл /tmp/cc/__db.002 (который является одним из индексов, созданных Berkeley DB), и повторно запустить программу, она будет получить SIGBUS при открытии среды (попытки для отображения несуществующего файла). Есть ли способ избежать этого, используя их API или это ошибка?

+0

Почему, если вы проверяете, существует ли файл, а если нет, создайте пустой файл? –

+0

Не должен ли апи делать это? – florinp

ответ

0

florinp, думаю, это ошибка Berkeley DB. На самом деле нужно проверить, чтобы файлы в среде были целы, прежде чем двигаться вперед.

Конечно, вы не можете многое сделать с базой данных CDP, которая была удалена таким образом, кроме как удалить ее и начать все заново. Если это общий тип сбоя, с которым вам приходится иметь дело, вы можете обернуть свою программу сценарием оболочки, который ищет статус выхода 135, а затем обжаривает старую базу данных и перезапускает программу ... но это может быть опасно в зависимости от вашего приложения ,

Вы также можете перейти в хранилище транзакций. Это даст вам больше возможностей для восстановления и, вероятно, меньше SIGBUS. :)

Смежные вопросы