【问题标题】:mkdir in /tmp not working: "Permission Denied"/tmp 中的 mkdir 不起作用:“权限被拒绝”
【发布时间】:2019-07-04 23:25:41
【问题描述】:

我正在尝试编写一个程序来处理应用程序的日志记录。这应该将日志写入/tpm/app-name/log.txt。为了做到这一点,我需要在编写之前创建目录app-name,以防它不存在。但是,我的代码不会创建目录,即使它以正确的权限运行也是如此。

我尝试过: * 使用chdir 移动到/tmp,然后创建app-name 目录 * 使用 root privs 运行程序(这不太理想,并且由于第 65 行无法访问系统其余部分正在运行的当前环境而导致代码错误)。

我希望这个程序能够在系统中的任何地方工作。

我当前的 C++ 代码:

#include <iostream>
#include <string>
#include <cstdlib>
#include <fstream>
#include <bits/stdc++.h>
#include <sys/stat.h>
#include <sys/types.h>

using namespace std;

int main(int argc, char* argv[])
{
        string name = argv[1];
        string DIR = "/tmp/" + name;
        string LOG_LOCATION = DIR + "/log.txt";
        int len = DIR.length();
        char LOG_DIR[len + 1];
        strcpy(LOG_DIR, DIR.c_str());
        string OUTPUT_LOG = "Some error log text";
        ofstream log;
        cout << OUTPUT_LOG << endl;
        if (mkdir(LOG_DIR, 1777) == -1)
        {
            cerr << "ERROR:  " << strerror(errno) << endl;
        }
        else
        {
            cout << "Directory created";
        }
        log.open (LOG_LOCATION);
        log << OUTPUT_LOG << endl;
        log.close();
}

使用此程序时,代码编译良好,甚至运行良好。它只是没有像我期望的那样创建目录。因此,它也不会生成日志文件。

谢谢!

【问题讨论】:

  • 尝试在你的 shell 中复制问题。在某些系统上tmpfs 与常规文件系统不同,它是按进程隔离的。有关 mktemp 的示例,请参阅 questions like this
  • 可能不是主要错误,但是:您可能希望将 1777 更改为 01777。
  • 请尝试提出一个最小的例子。 90% 的代码与创建目录无关。
  • 哦,看在 Bob 的份上,请停止使用 bits/stdc++.h。
  • 尽量不要反对建议。在最好的情况下,C++ 是一个棘手的野兽,并且经常简化你的代码,删除不需要的垃圾,远离反模式和不良实践有助于最大限度地减少正确实现它的麻烦。您不必使用每条建议,但您至少应该听取并接受建议。

标签: c++ linux mkdir


【解决方案1】:

所以我觉得这里真的很愚蠢,但我想出了我自己问题的答案是什么。

首先,我在标准输入上传递了错误的信息(程序使用此信息来创建正确的文件夹,而我输入的其中一个选项的格式错误,因此无法创建文件夹)。

其次,正如@Mark Plotnick 在第四条评论中指出的那样,正如后面其他几个人提到的那样,我需要在 mkdir 行的权限集中添加一个前导零。

故事的寓意:确保您在标准输入上传递正确的信息并获得正确的权限。呵呵

【讨论】:

    猜你喜欢
    • 2016-08-24
    • 2013-07-01
    • 2012-08-13
    • 1970-01-01
    • 2023-03-22
    • 2018-03-19
    • 2021-12-20
    相关资源
    最近更新 更多