在通过 Zed Shaw 的 learn C the Hard Way 工作时,我遇到了函数 apr_dir_make_recursive() 根据此处的文档具有类型签名
apr_status_t apr_dir_make_recursive(const char *path, apr_fileperms_t perm, apr_pool_t *pool)
这使得该目录与 Unix 命令 mkdir -p 相同。
为什么 IO 功能需要内存池才能运行?
我的第一个想法是,填充新创建的目录可能是一个可选参数,但是下面的代码使用了一个已初始化但假定为空的内存池。这是否意味着 IO 函数本身需要一个内存池,我们传入它以供它使用?但这似乎也不太可能。函数不能简单地创建一个本地内存池供它使用,然后在返回或错误时销毁?
那么,内存池有什么用呢?链接的文档在这一点上没有帮助。
出于好奇,代码缩短并显示在下面。
int DB_init()
{
apr_pool_t *p = NULL;
apr_pool_initialize();
apr_pool_create(&p, NULL);
if(access(DB_DIR, W_OK | X_OK) == -1) {
apr_status_t rc = apr_dir_make_recursive(DB_DIR,
APR_UREAD | APR_UWRITE | APR_UEXECUTE |
APR_GREAD | APR_GWRITE | APR_GEXECUTE, p);
}
if(access(DB_FILE, W_OK) == -1) {
FILE *db = DB_open(DB_FILE, "w");
check(db, "Cannot open database: %s", DB_FILE);
DB_close(db);
}
apr_pool_destroy(p);
return 0;
}