开始运行正常,运行十分钟后出现打开失败,并提示unable to open database file,网上查都说是权限问题,于是将db文件和所在目录权限全部改为777,即sudo chmod 777 PATH
,运行十分钟还是出现上次的问题。查看该程序的进程号,ps -ef | grep XXXX得到进程号,lsof -p pid | wc -l 看到该进程打开文件数打到一千多,并通过lsof-p pid看到
同一个目录打开N多没有关闭,于是查看代码,发现该目录打开位置没有做对应的关闭操作,导致进程打开的文件数达到了系统分配给用户的打开文件最大数,无法打开数据库文件
,加上closedir(),运行一个小时,问题没有再出现。问题解决。
void Station_select(char * line_name)
{
//lock
list_station.clear();
//lock
sqlite3 *db;
char **dbResult;
char *errmsg;
int nRow, nColumn;
int i,rc;
sql_mtx.lock();
while(1)
{
rc = sqlite3_open(sqlpath, &db);
if( rc != SQLITE_OK )
{
fprintf(stderr, "station select database: %s\n", sqlite3_errmsg(db));
usleep(SLEEPTIME);
continue;
}
char route_sql[256];
sprintf(route_sql,"select interval from station where route='%s'",line_name);
rc = sqlite3_get_table( db, route_sql, &dbResult, &nRow, &nColumn, &errmsg);
if (rc == SQLITE_OK)
{
for( i = 1; i < nRow ; i++ )
{
//lock
list_station.push_back(dbResult[i]);
//lock
}
}
else
{
sqlite3_close(db);
usleep(SLEEPTIME);
continue;
}
sqlite3_free_table(dbResult);
sqlite3_close(db);
usleep(SLEEPTIME);
break;
}
sql_mtx.unlock();
}