Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C、 将AWK语法作为参数传递给execl_C_Linux_Awk_Exec - Fatal编程技术网

C、 将AWK语法作为参数传递给execl

C、 将AWK语法作为参数传递给execl,c,linux,awk,exec,C,Linux,Awk,Exec,我想从C程序运行以下命令来读取系统的CPU和内存使用情况: ps aux|awk 'NR > 0 { cpu +=$3; ram+=$4 }; END {print cpu,ram}' 我试图将其传递给execl命令,然后读取其输出: execl("/bin/ps", "/bin/ps", "aux|awk", "'NR > 0 { cpu +=$3; ram+=$4 }; END {print cpu,ram}'",(char *) 0); 但在终端中,我得到以下错误: 错误:

我想从C程序运行以下命令来读取系统的CPU和内存使用情况:

ps aux|awk 'NR > 0 { cpu +=$3; ram+=$4 }; END {print cpu,ram}'
我试图将其传递给
execl
命令,然后读取其输出:

execl("/bin/ps", "/bin/ps", "aux|awk", "'NR > 0 { cpu +=$3; ram+=$4 }; END {print cpu,ram}'",(char *) 0);
但在终端中,我得到以下错误:

错误:不支持的选项(BSD语法)


我想知道如何正确地将awk作为参数传递给
execl

这里不能这样做

问题是您想要执行多个命令。execl用于执行单个命令。您的语句使用的是shell语法(特别是|)


您将有更好的运气将所有内容组合在一个字符串中并使用系统(3)调用。

您不能以这种方式在这里执行此操作

问题是您想要执行多个命令。execl用于执行单个命令。您的语句使用的是shell语法(特别是|)


您将更幸运地将所有内容组合到一个字符串中,并使用系统(3)调用。

您可以使用C进行过滤和求和,而不是运行awk并解析awk的输出,这通常会变得更加方便。(这与您在此处使用的确切命令大致相同。)


不用运行awk并解析awk的输出,您可以用C语言进行过滤和求和,这通常会变得更加方便。(这与您在此处使用的确切命令大致相同。)

正如威尔所建议的,popen()是用来捕获输出以供后续在程序中使用的。但是,如果您确实希望执行exec操作,则可以使用shell通过execl()进行竞价:

#包括
#包括
#包括
int main(int argc,字符**argv)
{
printf(“%s:execl意外返回:%d”,argv[0],
execl(“/bin/sh”、“/bin/sh”、“-c”,
“ps aux | awk'NR>0{cpu+=$3;ram+=$4};结束{print cpu,ram}”,
空);
出口(1);
}
正如威尔所建议的,popen()是用于捕获输出以供后续在程序中使用的工具。但是,如果您确实希望执行exec操作,则可以使用shell通过execl()进行竞价:

#包括
#包括
#包括
int main(int argc,字符**argv)
{
printf(“%s:execl意外返回:%d”,argv[0],
execl(“/bin/sh”、“/bin/sh”、“-c”,
“ps aux | awk'NR>0{cpu+=$3;ram+=$4};结束{print cpu,ram}”,
空);
出口(1);
}

嗯,我同意问题诊断;不过,解决方案显然并不正确。我希望使用popen()以便启动程序可以读取输出;不过,解决方案显然并不正确。我希望使用popen()以便启动程序可以读取输出。您使用c有什么特殊原因吗?您使用c有什么特殊原因吗?
#include <errno.h>
#include <stdio.h>

void ps_cpumem(FILE* f, double* cpu_total, double* mem_total) {
  for (;;) {
    char buf[2000];
    if (!fgets(buf, sizeof buf, f)) {
      return;
    }
    double cpu, mem;
    if (sscanf(buf, "%*s %*s %lf %lf", &cpu, &mem) == 2) {
      *cpu_total += cpu;
      *mem_total += mem;
    }
  }
}

int main() {
  errno = 0;
  FILE* ps = popen("ps aux", "r");
  if (!ps) {
    if (errno == 0) puts("popen: memory allocation failed");
    else perror("popen");
    return 1;
  }
  double cpu = 0, mem = 0;
  ps_cpumem(ps, &cpu, &mem);
  int rc = pclose(ps);
  if (rc == -1) return 1;
  printf("%%cpu: %5.1f\n" "%%mem: %5.1f\n", cpu, mem);
  return 0;
}
FILE* output = popen("ps aux | awk 'NR > 0 { cpu +=$3; ram+=$4 }; END {print cpu,ram}'", "r");
// read from output to do with as you like
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main(int argc, char **argv)
{
    printf("%s: execl returned unexpectedly: %d", argv[0],
            execl("/bin/sh", "/bin/sh", "-c",
            "ps aux | awk 'NR >0 { cpu += $3; ram+=$4}; END {print cpu, ram}'",
            NULL));
    exit(1);
}