C, передать синтаксис AWK в качестве аргумента для execl - PullRequest
0 голосов
/ 18 апреля 2010

Я хочу запустить следующую команду из программы на C, чтобы прочитать использование процессора и памяти системы:

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?

Ответы [ 3 ]

1 голос
/ 18 апреля 2010

Вместо запуска awk и анализа выходных данных awk вы можете выполнять фильтрацию и суммирование в 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;
}

Однако вы можете запустить полную команду через popen , так как она выполняет оболочку:

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
1 голос
/ 26 августа 2011

Как и предполагал Уилл, popen () - это то, что вы хотите для захвата вывода для последующего использования внутри вашей программы. Однако, если вы действительно хотите выполнить exec-операцию, вы можете использовать оболочку для выполнения торгов с помощью execl ():

#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);
}
1 голос
/ 18 апреля 2010

Вы не можете сделать это здесь таким образом.

Проблема в том, что вы хотите выполнить несколько команд. execl для выполнения одной команды. Ваше утверждение использует синтаксис оболочки (в частности, |)

Вам повезет, если объединить все это в одну строку и использовать вызов system (3).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...