通过system()C / C +将mpi rank传递给bash脚本; bizzare错误

时间:2013-12-29 19:50:06

标签: c linux bash mpi system-calls

我有一个带有MPI的C代码应该在不同的目录中执行bash脚本,具体取决于mpi-rank。例如:如果我用mpirun -np 10运行它mycode.o它应该每个进程应该执行调用系统,其中s是从snprintf创建的字符串(s,sizeof(s),“/ home / myaccount / myscript .sh%d“,排名);

完整代码如下:

#include        <stdio.h>
#include        <mpi.h>          /* MPI header file */ 
#include        <stdlib.h>
void main(int argc, char *argv[])
 {

   int rank, size;
                             /* init into MPI */
   MPI_Init(&argc, &argv);
                             /* my rank - my id */
   MPI_Comm_rank(MPI_COMM_WORLD, &rank);
                             /* how many processes in the virtual machine */
   MPI_Comm_size(MPI_COMM_WORLD, &size);


                             /*create script input (convert rank to string)*/
  char s[256];
  snprintf(s, sizeof(s), "/home/myaccount/myscript.sh %d", rank);
                             /* run script */
  system(s);


                             /* out of the virtual machine */
  MPI_Finalize();

  }

测试脚本是:

#!/bin/bash
for((k=16;k<22;k+=2));
    do echo cd /otherdirectory/test/"$k"/"$1"/;
    done;
exit;

当我使用mpirun -np 10运行时,应该给出:

cd / otherdirectory / test / 16/0 /
cd / otherdirectory / test / 16/9 /
cd / otherdirectory / test / 16/8 /

等等。但是返回

cd / otherdirectory / test / 16 / is_csh /
cd / otherdirectory / test / 18 / is_csh /
cd / otherdirectory / test / 20 / is_csh /

我无法弄清楚“is_csh”的来源。如果我使用printf(“%s \ n”)而不是系统,我会得到我上面所期望的。

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

在/ test /之后输出$k。 $ k从16到20运行。所以这是你应该期待的。

我会假设您的主目录中有.bashrc,或者可能是/ etc / bashrc,它会破坏1美元,因此当您的脚本最终到达时,该参数会被其他内容覆盖。

或许您的系统shell是csh或tcsh或类似的东西,并且在登录后切换到bash。当您从命令行启动脚本时,bash直接执行它。但是system()调用将从/ etc / passwd获取shell并运行<shell> -c <args to system>,因此启动时由csh执行的.login或.cshrc或类似文件也可能是罪魁祸首。