gpt4 book ai didi

c++ - 为什么 mkdir 的行为在不同的 Linux 发行版上不同?

转载 作者:太空宇宙 更新时间:2023-11-03 10:46:20 27 4
gpt4 key购买 nike

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

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

    #include <cstdlib>

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

这是我们产品中 CPP 单元测试的一部分。是的,它很丑。但在这种情况下,恐怕无能为力。

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

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

所以我改用下面的程序。有用! #包括

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

似乎系统默认使用 sh....谢谢您的回答!

最佳答案

一些术语: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 的符号链接(symbolic link),而在 Debian 和 Ubuntu 上它是符号链接(symbolic link)到更符合 Posix 且更快的 /bin/dash)

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

#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) 调用的命令有几个重要的优点:

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

关于c++ - 为什么 mkdir 的行为在不同的 Linux 发行版上不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20835714/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com