【问题标题】:Why chdir("~/dev/") returns -1?为什么 chdir("~/dev/") 返回 -1?
【发布时间】:2011-04-06 15:33:12
【问题描述】:

在我的 c++ 应用程序中,我想将工作目录更改为指定的目录。但是当我将"~/dev/" 指定为工作目录chdir() 失败并返回-1。相反,当我指定"/home/myusername/dev" 时它会起作用。为什么会发生这种情况?我该如何解决这个问题(除了检查字符串第一个字符是否为~ 并将其替换为/home/myusername)?

【问题讨论】:

  • chdir("$HOME/dev/") 也失败了,原因相同。

标签: c++ c unix


【解决方案1】:

波浪号 (~) 到 HOME 环境变量的扩展是由 bash 完成的。该扩展是在传递给 chdir 命令之前完成的。底线是 ~ 由 bash 处理,而不是由 chdir 命令处理。所以你不能在 chdir() 函数调用中使用它。

要查找 bash 完成的其他类型的扩展(以及 ~ 扩展的详细信息),请查看 this link

【讨论】:

    【解决方案2】:

    您可以使用以下内容检索~ 可能扩展为的内容(使用getpwuid):

    #include <stdlib.h>
    #include <unistd.h>
    #include <sys/types.h>
    #include <string.h>
    #include <pwd.h>
    
    // @prefer_env should be TRUE if you prefer the value of the $HOME
    //  environment variable over what is stored in the user's passwd
    char* get_homedir(int prefer_env)
    {
        char *found = getenv("HOME");
        char *homedir = NULL;
    
        if (!prefer_env || !found)
        {
            struct passwd *pw = getpwuid(geteuid());
            if (pw && pw->pw_dir) found = pw->pw_dir;
        }
    
        if (found)
        {
            // I would add error checking
            homedir = (char*)malloc(strlen(found) + 1);
            strcpy(homedir, found);
        }
    
        return homedir;
    }
    

    【讨论】:

    • 此代码不检查 HOME 环境变量,这可能会用不同的值覆盖密码条目中给出的路径。
    • @Al Riddoch:我总是对那个环境变量持怀疑态度,但这只是基于经验。我将更新我的代码以采取任何一个。
    • 对于代表用户以用户身份运行的代码,具有纯用户权限,您应该始终阅读HOME,以便为用户提供最大的灵活性。对于从提升权限的角度对用户主目录执行任何类型的权威查找的代码,您应该始终使用getpwuid_r
    【解决方案3】:

    ~ 的解析像任何环境变量一样落到了 shell 中。我不认为你可以在 C api 函数中使用它。

    【讨论】:

      【解决方案4】:

      好吧,当您在 shell 调用任何程序调用之前键入 ~ 时,shell 通常会将它替换为您的主目录(即使 cd 不是程序调用,而是在 shell 本身中实现)。

      无论如何:C 中无法自动将 ~ 替换为您的主目录

      【讨论】:

        【解决方案5】:

        正如前面的答案所述,C 库不会为您替换 ~。它是由外壳完成的。您不应该假设用户主目录是 /home/myusername,因为这是无法假设的。

        确定主目录的正确方法是检查 HOME 环境变量,并读取其内容。它通常会被定义,但如果不是,您应该回退到使用 getpwuid() 或类似调用来获取当前用户的密码条目,其中将包括他们的主目录。

        【讨论】:

          【解决方案6】:

          尝试改用 $HOME,~ 只是 $HOME 的快捷方式。

          【讨论】:

          • 其实如果$HOME没有设置,shell还是会扩展~到你的主目录,所以没有$HOME的快捷方式那么简单。
          猜你喜欢
          • 1970-01-01
          • 2011-08-14
          • 2012-01-25
          • 2012-03-05
          • 2017-06-04
          • 2015-01-25
          • 2023-03-27
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多