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;
}