14.5.1. Использование подпроцесса

We use cookies. Read the Privacy and Cookie Policy

14.5.1. Использование подпроцесса

Самый старый метод универсализации предусматривает запуск оболочки в качестве дочернего процесса и указание ей универсализировать файловые имена. Стандартная функция popen() (см. главу 10) упрощает этот метод — просто запустите команду ls *.с с помощью popen() и прочитайте результат. Этот подход может показаться несколько упрощенным, но все же он обеспечивает переносимое решение проблемы универсализации (вот почему приложения вроде Perl используют его).

Ниже приведена программа, которая универсализирует все аргументы и отображает все совпадения.

 1: /* popenglob.c */

 2:

 3: #include <stdio.h>

 4: #include <string.h>

 5: #include <sys/wait.h>

 6: #include <unistd.h>

 7:

 8: int main(int argc, const char ** argv)

 9:  char buf[1024];

10:  FILE * ls;

11:  int result;

12:  int i;

13:

14:  strcpy(buf, "ls");

15:

16:  for (i = 1; i < argc; i++) {

17:   strcat(buf, argv[i]);

18:   strcat(buf, " ");

19:  }

20:

21:  ls = popen(buf, "r");

22:  if (!ls) {

23:   perror("popen");

24:   return 1;

25:  }

26:

27:  while (fgets(buf, sizeof(buf), ls))

28:   printf("%s", buf);

29:

30:  result = pclose(ls);

31:

32:  if (!WIFEXITED(result)) return 1;

33:

34:  return 0;

35: }