[<<Previous Entry] [^^Up^^] [Next Entry>>] [Menu] [About The Guide]
 Вызов команды из Си-программы - Пример

Этот пример демонстрирует исполнение команды shell из Си-программы. Он
показывает функцию  общего назначения,  которая принимает  в  качестве
аргумента произвольную  команду shell.  Функция создает  подпроцесс  и
исполняет shell,  передав ему  свой параметр  в качестве команды. Этот
пример похож на библиотечную функцию system(3).

15-18     Подпроцесс исполняет shell. Флаг -c, переданный shell'у
означает, что следующий аргумент - это командная строка.
19-20     Цикл while ожидает завершения определенного подпроцесса, а
именно запущенного shell'а. Причина использования цикла состоит в том,
что может существовать несколько завершившихся подпроцессов. Функция
command() может быть использована в большой программе, которая создает
другие подпроцессы. Кроме того, цикл прекращается, если системный
вызов wait(2) завершается неуспехом. Например, wait(2) возвращает -1 и
устанавливает errno в EINTR, если он был прерван перехваченным
сигналом. Кроме того, он может возвратить -1, если fork(2) в строке 15
завершился неуспехом.
24   Код завершения возвращается в вызвавшую функцию.
27-33     Эта функция main() является тестовым драйвером для
command(). main() исполняет некоторые команды shell и распечатывает
код возврата функции command(). Эта программа компилируется командой
              cc -DDEBUG -o command command.c

          Эта техника  используется для  включения драйверной  функции
          main() для тестирования и отладки функции.

Этот пример демонстрируется так:
$ command
Sun Oct  6 12:04:04 EDT 1990
0
date: bad conversion
1

Файл: command.c
                ВЫЗОВ КОМАНДЫ ИЗ СИ-ПРОГРАММЫ - ПРИМЕР

 1 #include <sys/types.h>
 2 #include <unistd.h>
 3 #include <stdlib.h>
 4 #include <wait.h>
 5 #include <stdio.h>
 6 int command(char *);
 7
 8 /* run a shell command from C program */
 9
10 int command(char *cmd)
11 {
12     pid_t chpid, w;
13         int status;
14
15     if ((chpid = fork()) == 0) {
16                 execlp("sh", "sh", "-c", cmd, (char *) 0);
17         exit(127);
18     }
19         while ((w = wait(&status)) != chpid && w != -1)
20         ;       /* null */
21     if (w == -1)
22                 return(-1);
23     else
24                 return(WEXITSTATUS(status));
25 }
26
27 #if DEBUG
28 main()          /* test command() function */
29 {
30     printf("%d\n", command("date > Date; cat Date"));
31         printf("%d\n", command("date -x"));
32 }
33 #endif