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);
    }
}
  1. strcat 附加到适当的字符串。从 getpwuid 返回的字符串根本不是要写入的。

  2. 当然不能保证它后面有任何可用的 space,所以你不能安全地附加到它。

  3. 即使可以,您也会调用 strcat 两次,因此传递给 mkdir 的字符串类似于 /home/zach/.junk//.junk/,这将失败,因为您'重新尝试在 /home/zach/.junk 中创建您刚刚确定不存在的目录。

这段代码的编写方式就好像您认为字符串是 C 语言中的“第一个 class”对象,它可以像在许多其他语言中一样纯粹作为值进行操作。好吧,它们不是 - 它们是字符数组,与所有其他数组一样,内存管理由您决定。