【问题标题】:File IO in the apache portable runtime libraryapache 可移植运行时库中的文件 IO
【发布时间】:2013-07-23 23:24:16
【问题描述】:

在通过 Zed Shaw 的 learn C the Hard Way 的过程中,我遇到了根据 the documentation here 具有类型签名的函数 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;

}

【问题讨论】:

    标签: c apr


    【解决方案1】:

    如果你调出源代码,你会看到:apr_dir_make_recursive() 调用path_remove_last_component()

    static char *path_remove_last_component (const char *path, apr_pool_t *pool)
    {
        const char *newpath = path_canonicalize (path, pool);
        int i;
    
        for (i = (strlen(newpath) - 1); i >= 0; i--) {
            if (path[i] == PATH_SEPARATOR)
                break;
        }
    
        return apr_pstrndup (pool, path, (i < 0) ? 0 : i);
    }
    

    此函数正在创建apr_pstrndup() 中路径的副本,每个副本代表它的一个较小的组件。

    回答您的问题 - 因为它是如何实施的。是否可以在不分配内存的情况下做同样的事情,是的。我认为在这种情况下,通过复制必要的路径组件,一切都变得更清晰、更易读。

    【讨论】:

      【解决方案2】:

      函数的实现(找到here)表明pool 用于分配表示路径各个组件的字符串。

      该函数不创建自己的本地池的原因是该池可以在多次调用apr_*() 函数时重复使用。碰巧DB_init() 不需要重用apr_pool_t

      【讨论】:

      • 嗯,我同意这一点,但是为什么 apr_dir_make 也需要它,尽管没有使用它?仅仅是为了给程序员提供一个统一的接口/抵抗程序内部的变化,以防他们确实需要在函数内分配内存?
      • 我在您的原始帖子中没有看到关于 apr_dir_make 的问题。查看源代码,pool 参数未用于该函数。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-19
      • 2013-10-25
      • 2012-10-21
      • 2013-12-25
      相关资源
      最近更新 更多