【问题标题】:How can I get the value of a variable from a C program I've run with a bash script?如何从使用 bash 脚本运行的 C 程序中获取变量的值?
【发布时间】:2021-12-26 07:59:08
【问题描述】:

我在 for 循环中运行我的程序,向它传递不同的 num_threads 值。

for (( j=1; j<9; j++ ))
    do
        mpirun -n $j ./my_program
    done

我知道 bash 会将返回值存储在 $?自动地。但是,我想要做的是在传递 num_threads=1 的参数时获取并行程序的运行时,这样当 num_threads>1 时,我可以使用这个值来找到运行该程序时的加速。我需要为此返回一个双精度数,并且我曾尝试从 main() 返回一个双精度数:

double main(int argc, char** argv) {
double run_time;
...

return run_time;

}

但似乎 main() 只能返回一个 int,而我从我的 bash 脚本中得到一个 0。

time=$?
echo $time

output:
0

【问题讨论】:

  • 也许只是time mpirun ...
  • 那种。这将适用于为整个程序计时。问题是我只需要对程序的特定部分进行计时。它使用 Quicksort 函数,我正在计时调用 Quicksort() 的部分。所以我想我必须在程序本身内计时。
  • 程序返回的是退出状态——一个单字节无符号整数。它通常用于指示程序是否成功(零=成功,非零=某种失败)。它不能传递其他类型的数据,并且将其用于成功/失败以外的任何事情几乎总是一个坏主意。
  • @marti : double main 根据 C 标准不仅是非法的,而且没有任何意义。 main 总是返回一个整数,如果它是小于 256 的整数,你只能依赖它(即取决于操作系统)。如果编译器没有抱怨 double,它至少会默默地忽略它。此外,main 通常由exit 终止,而不是return。我的猜测是return 也可以;这里有点不寻常。

标签: c bash script environ


【解决方案1】:

从你的程序中输出值。

int main(int argc, char** argv) {
    double run_time;
    ...
    
    fprintf(stderr, "%f\n", run_time);
}

然后:

for (( j=1; j<9; j++ )); do
    echo -n "$j " >> speed.txt
    mpirun -n $j ./my_program 2>>speed.txt
    # or you want to see it
    # mpirun -n $j ./my_program 2> >(tee -a speed.txt >&2)
done
sort -k2g speed.txt   # -g is from GNU sort

一般double main(int, char**) 的形式是无效的 - main 必须只有特定的形式,见https://en.cppreference.com/w/cpp/language/main_function

【讨论】:

  • 好答案!为什么选择打印到stderr 而不是stdout
  • 我猜,因为stderr用于记录不是程序输出的信息(如C++中的std::clog),但如果程序没有产生相关输出,那么stdout可能是更合适,也许使用像 3 这样的不同 fd 可能会更好。
  • 非常感谢所有有用的答案。在将它输出到 speed.txt 后,我​​能够使用 tail 来获取我需要的值
猜你喜欢
  • 1970-01-01
  • 2010-10-13
  • 1970-01-01
  • 1970-01-01
  • 2021-11-16
  • 2017-12-25
  • 2013-10-26
  • 2014-12-22
  • 2013-03-25
相关资源
最近更新 更多