C ++ system()导致“文本文件忙”错误

时间:2016-07-25 16:08:18

标签: c++ bash

我需要多次执行FORTRAN程序,这需要用户每次插入4个数值。 我找到了一个使用Python脚本自动生成的解决方案...这个脚本基本上在每次迭代时创建一个包含以下行的.sh文件(a.out是我必须自动执行的FORTRAN程序的名称)

./a.out<<EOF
param01
param02
param03
param04
EOF

使其可执行,并执行它。

所以,我试图在C ++中做同样的事情......我写了像

这样的东西
int main()
{

long double mass[3] = {1.e+10,3.16e+10,1.0e+11};
double tau[3] = {0.5,0.424,0.4};
double nu[3] = {03.0,4.682,10.0};
long double Reff[3] = {1.0e+3,1.481e+3,3.0e+3};
int temp=0;



for (int i=0; i<3; i++)
    {
    ofstream outfile("shcommand.sh");
    outfile << "./a.out<<EOF" << endl << mass[i] << endl << nu[i] << endl << Reff[i] << endl << tau[i] << endl << "EOF" << endl;
    temp=system("chmod +x shcommand.sh");
    temp=system("./shcommand.sh");
    }

return 0;   

}

但是当我运行我的C ++程序时,我收到以下错误消息

sh: 1: ./shcommand.sh: Text file busy
sh: 1: ./shcommand.sh: Text file busy
sh: 1: ./shcommand.sh: Text file busy

是否与C ++程序有关,试图在上一次迭代完成之前修改.sh文件? 我在网上看了一下,我似乎理解了命令完成后只返回system()命令...

2 个答案:

答案 0 :(得分:3)

您正在尝试运行一个打开的文件,这不是一个好主意。在chmod ding /运行它之前关闭它:

for (int i=0; i<3; i++)
{
    {
        ofstream outfile("shcommand.sh");
        outfile << "./a.out<<EOF" << endl << mass[i] << endl << nu[i] << endl << Reff[i] << endl << tau[i] << endl << "EOF" << endl;
        // the file is closed when outfile goes out of scope
    }
    temp=system("chmod +x shcommand.sh");
    temp=system("./shcommand.sh");
}

顺便说一下,通过直接写入程序的标准输入(例如popen)可以避免所有这些shell混乱:

for (int i=0; i<3; ++i) {
    FILE *fd = popen("./a.out", "w");
    assert(fd!=NULL); // do proper error handling...
    fprintf(fd, "%Lf\n%f\n%Lf\n%f\n", mass[i], nu[i], Reff[i], tau[i]);
    fclose(fd);
}

答案 1 :(得分:2)

似乎因为shell无法读取脚本,因为它仍然由您的程序打开。

在致电outfile.close();之前尝试添加system()