mkdir() 的多个问题
Multiple issues with mkdir()
在 C 项目中,我试图在特定目录中创建一个目录。
// Find the user's home directory.
// Code from
struct passwd * pw = getpwuid(getuid());
char * home = pw->pw_dir;
// Test if the ".junk" directory exists in the home directory.
// If not, create it.
if (opendir(strcat(home, "/.junk/")) == NULL) {
printf(" - no junk directory\n");
if (mkdir(strcat(home, "/.junk/"), 0777) < 0) {
fprintf(stderr, "Error: Cannot create junk directory.\n");
perror(" - errno");
exit(1);
}
}
opendir()
正常工作:如果 .junk/
目录存在于 ~/
中,那么我不会收到任何打印消息,如果该目录不存在,那么我得到一些输出。但是 mkdir()
真的很挑剔,导致了很多问题。如果 ~/.junk/
不存在,那么我得到这个输出:
- no junk directory
Error: Cannot create junk directory.
- errno: No such file or directory
但是如果我尝试在当前目录中创建目录,例如mkdir("./.junk/", 0777)
,目录将被正确创建。这是怎么回事?为什么它在 ~/
中的行为不同,我怎样才能让它工作?
您已将 home
设置为 pw->pw_dir
,它被定义为 char *
类型,并且您正在尝试附加到它。不能保证 pw->pw_dir
指向的内容有足够的 space 来附加额外的字符。您很有可能正在写超过缓冲区的末尾。
即使您没有覆盖缓冲区,您也会附加两次“/.junk”,因此您传递给 mkdir
的字符串是“home/.junk//.junk”
您需要为完整的目录名称创建一个单独的字符串,该字符串足够大以容纳它并在那里构建它。
struct passwd * pw = getpwuid(getuid());
char * home = pw->pw_dir;
char junk_dir[strlen(pw->pw_dir) + strlen("/.junk/") + 1];
sprintf(junk_dir, "%s/.junk/", home);
// Test if the ".junk" directory exists in the home directory.
// If not, create it.
if (opendir(junk_dir) == NULL) {
printf(" - no junk directory\n");
if (mkdir(junk_dir), 0777) < 0) {
fprintf(stderr, "Error: Cannot create junk directory.\n");
perror(" - errno");
exit(1);
}
}
strcat
附加到适当的字符串。从 getpwuid
返回的字符串根本不是要写入的。
当然不能保证它后面有任何可用的 space,所以你不能安全地附加到它。
即使可以,您也会调用 strcat
两次,因此传递给 mkdir
的字符串类似于 /home/zach/.junk//.junk/
,这将失败,因为您'重新尝试在 /home/zach/.junk
中创建您刚刚确定不存在的目录。
这段代码的编写方式就好像您认为字符串是 C 语言中的“第一个 class”对象,它可以像在许多其他语言中一样纯粹作为值进行操作。好吧,它们不是 - 它们是字符数组,与所有其他数组一样,内存管理由您决定。
在 C 项目中,我试图在特定目录中创建一个目录。
// Find the user's home directory.
// Code from
struct passwd * pw = getpwuid(getuid());
char * home = pw->pw_dir;
// Test if the ".junk" directory exists in the home directory.
// If not, create it.
if (opendir(strcat(home, "/.junk/")) == NULL) {
printf(" - no junk directory\n");
if (mkdir(strcat(home, "/.junk/"), 0777) < 0) {
fprintf(stderr, "Error: Cannot create junk directory.\n");
perror(" - errno");
exit(1);
}
}
opendir()
正常工作:如果 .junk/
目录存在于 ~/
中,那么我不会收到任何打印消息,如果该目录不存在,那么我得到一些输出。但是 mkdir()
真的很挑剔,导致了很多问题。如果 ~/.junk/
不存在,那么我得到这个输出:
- no junk directory
Error: Cannot create junk directory.
- errno: No such file or directory
但是如果我尝试在当前目录中创建目录,例如mkdir("./.junk/", 0777)
,目录将被正确创建。这是怎么回事?为什么它在 ~/
中的行为不同,我怎样才能让它工作?
您已将 home
设置为 pw->pw_dir
,它被定义为 char *
类型,并且您正在尝试附加到它。不能保证 pw->pw_dir
指向的内容有足够的 space 来附加额外的字符。您很有可能正在写超过缓冲区的末尾。
即使您没有覆盖缓冲区,您也会附加两次“/.junk”,因此您传递给 mkdir
的字符串是“home/.junk//.junk”
您需要为完整的目录名称创建一个单独的字符串,该字符串足够大以容纳它并在那里构建它。
struct passwd * pw = getpwuid(getuid());
char * home = pw->pw_dir;
char junk_dir[strlen(pw->pw_dir) + strlen("/.junk/") + 1];
sprintf(junk_dir, "%s/.junk/", home);
// Test if the ".junk" directory exists in the home directory.
// If not, create it.
if (opendir(junk_dir) == NULL) {
printf(" - no junk directory\n");
if (mkdir(junk_dir), 0777) < 0) {
fprintf(stderr, "Error: Cannot create junk directory.\n");
perror(" - errno");
exit(1);
}
}
strcat
附加到适当的字符串。从getpwuid
返回的字符串根本不是要写入的。当然不能保证它后面有任何可用的 space,所以你不能安全地附加到它。
即使可以,您也会调用
strcat
两次,因此传递给mkdir
的字符串类似于/home/zach/.junk//.junk/
,这将失败,因为您'重新尝试在/home/zach/.junk
中创建您刚刚确定不存在的目录。
这段代码的编写方式就好像您认为字符串是 C 语言中的“第一个 class”对象,它可以像在许多其他语言中一样纯粹作为值进行操作。好吧,它们不是 - 它们是字符数组,与所有其他数组一样,内存管理由您决定。