【发布时间】: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