gpt4 book ai didi

c - apache 可移植运行时库中的文件 IO

转载 作者:太空宇宙 更新时间:2023-11-04 03:54:28 24 4
gpt4 key购买 nike

在阅读 Zed Shaw 的 learn C the Hard Way 时,我遇到了函数 apr_dir_make_recursive(),根据 the documentation here有类型签名

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;

}

最佳答案

如果打开源代码,您会看到: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() 中创建路径的副本,每个副本代表它的一个较小组件。

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

关于c - apache 可移植运行时库中的文件 IO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17822660/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com