【发布时间】:2011-04-06 16:57:22
【问题描述】:
当我写作时
mkdir("~/folder1" , 0777);
在 linux 中,创建目录失败。如果我将 ~ 替换为扩展的主目录,它可以正常工作。使用~有什么问题?
谢谢
【问题讨论】:
当我写作时
mkdir("~/folder1" , 0777);
在 linux 中,创建目录失败。如果我将 ~ 替换为扩展的主目录,它可以正常工作。使用~有什么问题?
谢谢
【问题讨论】:
~ 只有 shell 知道,mkdir 系统调用不知道。
但如果你尝试:
system("mkdir ~/foo");
这是因为 "mkdir ~/foo" 被传递给 shell,shell 将 ~ 扩展为 $HOME
如果你想使用$HOME和mkdir,你可以使用getenv函数:
char path[MAX];
char *home = getenv ("HOME");
if (home != NULL) {
snprintf(path, sizeof(path), "%s/new_dir", home);
// now use path in mkdir
mkdir(path, PERM);
}
【讨论】:
sprintf 之前检查 home 的长度。
MAX 至少是那个大小或更大。这些功能确实适用于不知道自己在做什么的人。这就是为什么在过去人们知道如何编程时它们不存在的原因。
HOME 的值没有最大长度,即使有效路径名有最大长度。写出来的代码容易出现缓冲区溢出,这样写错代码与“知道如何编程”完全相反。
~ 是一个 shell 元字符,而不是内核提供的“快捷方式”。
如果您想轻松支持~,请参阅wordexp(3) 或glob(3) 手册页。 (他们可能做的比你想要的多。)
【讨论】:
glob(3) 条目;它没有 ~ 但仍然有用。)
GLOB_TILDE(和GLOB_TILDE_CHECK)。
~ 通常由 shell 扩展。不使用 shell 意味着你负责扩展它。
【讨论】: