【问题标题】:system() c++ wont run in VirtualBoxsystem() c++ 不会在 VirtualBox 中运行
【发布时间】:2012-05-15 20:17:56
【问题描述】:

我正在尝试编译和运行该应用程序,该应用程序是 4 年前创建的。它是在 Embarcadero RAD Studio C++ builder 中为 Windows 开发的。现在我尝试使用最新版本的 RAD Studio 在 VirtualBox 中的 Windows 中编译和运行它。我在我的应用中对另一个应用进行了系统调用:

      system("dot.exe -Tjpg -o nfa.jpg NFA_graph.txt");

它一直返回 1 并且文件没有被创建。我也试过了

      system("Echo %CD% >> z:\log.txt");

并且文件没有被创建。我也试过这样:

FILE *fpipe;
char *command = "Echo %CD% >> z:\log.txt";
char line[256];

if (0 == (fpipe = (FILE*)_popen(command, "r")))
{
    perror("popen() failed.");
    exit(1);
}

while (fread(line, sizeof line, 1, fpipe))
{
    ShowMessage(line);
}

_pclose(fpipe);

我什么也没得到。我想知道这种奇怪行为的原因是否是我在 VirtualBox 中运行这一切?

【问题讨论】:

  • 这个“z:\log.txt”应该是“z:\\log.txt”。
  • 我猜你在 4 年前使用的是 Windows XP 和现在的 Windows 7,它不允许你在没有管理员权限的情况下写入根文件夹。如果从命令行运行它会发生什么?

标签: c++ system virtualbox c++builder system-calls


【解决方案1】:

你没有逃避你的 \ 字符。您应该在文件路径中使用 /,如果必须,则使用 \\。此外,Windows 7 不允许您在没有管理员权限的情况下写入硬盘驱动器的根目录。

要确定命令环境是否可用,首先执行以下操作:

if (!system(NULL)) {
    // Can't make any system() calls
}

如果您的命令环境可用,那么您需要完全指定路径,确保像我上面提到的那样转义\,并且不要向驱动器的根目录写入任何内容。另请注意,打开文件不会默认创建目录。

【讨论】:

    【解决方案2】:

    不,这不太可能。我发现您的代码存在一些问题:如果 system() 返回 1,您没有检查 errno。它可以帮助您发现真正的问题。此外,所有反斜杠都必须 Esc'ed。

    我建议dot.exe 不在PATH 环境变量中,这就是system() 失败的原因。

    【讨论】:

    • 我检查了 errno,它是 1。Echo %CD% >> z:\\log.txt 也不起作用 :^( dot.e×e 在路径上。从命令提示命令 dot.exe -Tjpg -o nfa.jpg NFA_graph.txt 工作正常
    猜你喜欢
    • 1970-01-01
    • 2019-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多