如何将shell命令输出分配给C语言中的变量

时间:2010-10-09 06:56:42

标签: c system popen

我希望在变量中收集shell命令(echo free | grep Mem| awk '{print $2}')的输出,以便我可以在C程序中使用它。所以我在这里有代码。

 system("TOTAL=$(echo `free | grep Mem| awk '{print $2}'`)");
 popen("grep -v procs $1 | grep -v free | awk '{USED=TOTAL-$4-$5-$6;print USED}'", "r");

如上所示,我可以在popen()调用中的同一程序中使用变量TOTAL吗?

4 个答案:

答案 0 :(得分:2)

您需要创建一个包含要运行的完整脚本的字符串,或者您需要创建一个可以简单运行的脚本,然后安排使用popen()读取该脚本的输出。要么是可能的;这更容易取决于你的脚本技能水平与你的C编程技能。

char command[4096];

strcpy(command, "TOTAL=$(free | grep Mem| awk '{print $2}')\n");
strcat(command, "grep -v procs $1 | grep -v free |\n");
strcat(command, "awk '{USED=TOTAL-$4-$5-$6;print USED}' TOTAL=$TOTAL\n");

FILE *in = popen(command, "r");

...read the results, etc...

字符串操作简化了第一个shell脚本,然后将计算的TOTAL值传递给awk

另一种方法是从free | grep Mem | awk '{print $2}'读取popen()的输出 - 值为TOTAL - 从char command[4096]; strcpy(command, "free | grep Mem| awk '{print $2}'"); char total[20]; FILE *in1 = popen(command, "r"); ...read TOTAL into total... strcpy(command, "grep -v procs $1 | grep -v free |\n"); strcat(command, "awk '{USED=TOTAL-$4-$5-$6;print USED}' TOTAL="); strcat(command, total); FILE *in2 = popen(command, "r"); 的一次使用,然后将该值构建到第二个命令中:

{{1}}

答案 1 :(得分:0)

我不认为这是可能的,因为system要求shell运行命令并在命令完成后返回,基本上也会杀死它所分叉的shell。因此,设置的任何环境变量也将丢失。

答案 2 :(得分:0)

您需要在与使用它的位置相同的子shell中处理TOTAL的设置;环境变量不会在子进程之间传输(唯一有效的是继承其父进程的env-vars的子进程)。你可能会这样做(我删除了一些无用的混淆):

FILE *f = popen("TOTAL=$(free | grep Mem | awk '{print $2}');"
        "grep -v procs $1 | grep -v free | "
        "awk '{USED=TOTAL-$4-$5-$6;print USED}'",
        "r");

注意多行字符串常量。但是,我怀疑即使这样也行不通,因为它似乎是混乱的不同语言。 (例如,$1看起来非常可疑,因为它不在通常适用于这些事情的上下文中。)您可能会发现将所有复杂脚本放入可以运行的正确shell脚本中更容易,因为那么你将同时使用更少的语言,可以分阶段调试,而不是一次调试......

答案 3 :(得分:0)

您可以使用FIFO或至少使用简单的临时文件。