[<<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