C++ 在c++;

C++ 在c++;,c++,cluster-computing,system,wine,C++,Cluster Computing,System,Wine,我已经编写了一段代码,在某个时刻使用系统命令调用外部可执行文件。 我是这样做的: 首先删除外部代码的输出文件 boost::filesystem::remove("Results/CVground.bin"); boost::filesystem::remove("Results/CVground.BUD"); 然后为外部代码编写输入文件。代码太长,无法粘贴到此处。它只写很少的ascii文件 然后运行模型。更糟糕的是,正如您所看到的,我正在使用wine调

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

首先删除外部代码的输出文件

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;
}
我不明白的是系统的输出是正的,我相信这意味着系统命令是成功的。有没有办法从系统命令中获取更多信息

更新

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

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

系统命令是否可能在执行代码完成之前返回?我已经看到了一个明确的没有答案的问题,但我想知道,如果事情变得越来越棘手,因为我打电话通过葡萄酒


谢谢

系统函数返回您运行的命令的退出代码。按照惯例,流程成功时返回0,失败时返回非零。非零退出代码的含义取决于应用程序,
wine
。如果不将其输出重定向到
/dev/null

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

是否为“处理器编号”类型?如果您指的是进程号,即PID,那么这没有问题,每次运行新进程时,您都会得到一个新的PID,Linux会在每次执行新进程时增加PID。
 Sys output from rank 78 is 32512