1

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;

}
4

2 に答える 2

0

関数の実装 (ここにあります) は、poolがパスの個々のコンポーネントを表す文字列を割り当てるために使用されることを示しています。

関数が独自のローカル プールを作成しない理由は、関数への複数の呼び出しでプールが再利用される可能性があるためapr_*()です。DB_init()を再利用する必要がないのはたまたまですapr_pool_t

于 2013-07-23T23:43:22.010 に答える