为什么mkdir的行为在不同的Linux发行版上有所不同?

时间:2013-12-30 08:07:15

标签: c++ system

我正在尝试使用下面的C ++程序创建名为1 2 3 4的文件夹。我可以在 RHEL 中成功实现这一目标。 但是,它在 ubuntu 13.10 中创建了一个名为{1..4}的文件夹。

为什么会这样?谢谢你的帮助!

    #include <cstdlib>

    int main()
    {
        std::system("mkdir {1..4}");
    }

这是我们产品中CPP单元测试的一部分。是的,这很难看。但是我担心在这种情况下可以做的事情很少。

你是对的。 在RHEL,     sh -c'echo {1..4}'     1 2 3 4

在Ubuntu中     sh -c'echo {1..4}'     {1..4}

所以我使用下面的程序。有用!    #include

int main()
{
    std::system("bash -c 'mkdir {1..4}'");
}

默认情况下系统使用sh ....感谢您的回答!

1 个答案:

答案 0 :(得分:7)

一些术语:Linux directories中有file systems,而不是“文件夹”(文件夹可能在桌面上直观显示,但这是桌面详细信息)。

您无需使用system(3)(正在运行sh而不是bash!)。 并且POSIX sh不知道{1..4}表示法,因此{1..4}字符串将 verbatim 传递给/bin/mkdir命令(请参阅mkdir(1) } ...)。

运行

 sh -c 'echo {1..4}'

测试sh不理解{1..4}符号。

(所以这是旧RHEL中的一个错误,其中/bin/sh可能是/bin/bash的符号链接,而在Debian和Ubuntu上它是符合Posix的更快且更快{{1}的符号链接})

只需使用mkdir(2)系统调用和代码

即可
/bin/dash

我希望您不要创建名为#include <cstdlib> #include <cstdio> #include <sys/stat.h> #include <sys/types.h> int main() { for (int i=1; i<=4; i++) { char buf[8]; snprintf(buf, sizeof(buf), "%d", i); if (mkdir(buf, 0755)) { perror("mkdir"); exit(EXIT_FAILURE); }; } } 单个目录。它既可能又简单,但味道确实很差。为了您的心理安全,请在目录名称中仅使用字母,数字和下划线1 2 3 4

我使用snprintf(3)将int转换为字符缓冲区。使用C++11,您可以使用std::to_stringc_str ...

阅读Advanced Linux Programming ...

使用_系统调用而不是通过mkdir(2)调用的命令有几个重要优点:

  • 速度要快得多,您不需要像system(3)这样的/bin/sh -c system(3) shell应该这样做。
  • 它使用的资源少得多,因为没有额外的流程fork - ed,所以当你达到极限时,你的程序仍会运行(参见fork(2) ...)
  • 它更可靠。如果mkdir(2)失败,你可以(并且应该)很好地处理失败。请参阅setrlimit(2)errno(3) ....