【问题标题】:strange behavior with system command in c++c++中系统命令的奇怪行为
【发布时间】:2021-07-07 09:21:01
【问题描述】:

我编写了一段代码,在某些时候使用系统命令调用外部可执行文件。 这是我的做法:

先去掉外部代码的输出文件。

boost::filesystem::remove("Results/CVground.bin");
boost::filesystem::remove("Results/CVground.BUD");

然后为外部代码编写输入文件。代码太长,不能贴在这里。它只写了几个 ascii 文件。

然后运行模型。更糟糕的是,正如您所见,我正在使用 wine 在 linux 下调用 Windows 可执行文件。

std::string sim_command = "/opt/wine-stable/bin/wine ";
sim_command.append(cvd.simulationExe()).append(" CVsimAqua.in >/dev/null");
int sys = system(sim_command.c_str());

基本上我在系统下调用的命令如下

int sys = system("/opt/wine-stable/bin/wine Simulation3.02.exe CVsimAqua.in >/dev/null");

更新:

根据建议,我修改了上面的命令,以便它打印到这样的文件

int sys = system("/opt/wine-stable/bin/wine Simulation3.02.exe CVsimAqua.in > log.dat");

这通常需要几分钟才能完成。 然后我正在检查输出文件是否实际存在,如下所示:

if (!boost::filesystem::exists("Results/CVground.bin")) {
    std::cout << "\t\tSys output from rank " << rank << " is " << sys << std::endl;
    fun.clear();
    fun.push_back(10000000);
    fun.push_back(10000000);
    boost::filesystem::current_path(main_dir);
    return;
}

我发现在某些情况下,我的日志文件中确实出现了以下打印内容。每次运行的排名数不同。

 Sys output from rank 78 is 32512

我不明白的是system的输出是正的,我认为这意味着system命令成功。有没有办法从系统命令中获取更多信息?

更新

在我将 /dev/null 更改为 log.dat 后,我​​意识到当系统出现故障时,它甚至不会创建 log.dat 文件,但是我总是在调用 system(NULL) 之前检查系统是否可用系统。

我发现调试起来非常困难,因为这些错误只有在我在集群上运行代码时才会发生。

系统命令是否可能在执行代码完成之前返回?我已经看到对这个问题的肯定回答,但我想知道事情是否变得越来越棘手,因为我是通过葡萄酒打电话的。

谢谢

【问题讨论】:

  • 是“处理器编号”类型吗?如果您的意思是进程号,即。 PID 那么就没有问题了,每次运行一个新进程都会得到一个新的 PID,Linux 确实会在每次执行新进程时递增 PID。

标签: c++ cluster-computing system wine


【解决方案1】:

system 函数从您运行的命令返回退出代码。按照惯例,进程在成功时返回 0,在失败时返回非零。非零退出代码的含义取决于应用程序,在这种情况下为wine。如果不将其输出重定向到/dev/null,可能会更容易调试

system 调用本身失败时有一些特定的返回值:-1 是无法创建进程,如果无法执行 shell,则为 127。有关这些案例的详细信息,请参阅man 3 system

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-31
    • 2015-03-28
    • 1970-01-01
    • 2012-04-05
    • 1970-01-01
    • 1970-01-01
    • 2012-06-21
    相关资源
    最近更新 更多