Основы программирования в Linux
Шрифт:
#include <stdlib.h>
int system(const char *string);
Функция
system
выполняет команду, переданную ей как строку, и ждет ее завершения. Команда выполняется, как если бы командной оболочке была передана следующая команда:
$ sh -с string
Функция
system
возвращает код 127, если командная оболочка не может быть запущена для выполнения команды, и -1 в случае другой ошибки. Иначе system
вернет код завершения
Выполните упражнение 11.1.
Упражнение 11.1. Функция
system
Вы можете использовать
system
для написания программы, выполняющей команду ps
. Хотя нельзя сказать, что она необычайно полезна, вы увидите, как применять этот метод в последующих примерах. (Для простоты примера мы не проверяем, работает ли на самом деле системный вызов.)
#include <stdlib.h>
#include <stdio.h>
int main {
printf("Running ps with system\n");
system("ps ax");
printf("Done \n");
exit(0);
}
Когда вы откомпилируете и выполните программу system1.с, то получите вывод, похожий на приведенный далее:
$ ./system1
Running ps with system
PID TTY STAT TIME COMMAND
1 ? Ss 0:03 init [5]
...
1262 pts/1 Ss 0:00 /bin/bash
1273 pts/2 S 0:00 su -
1274 pts/2 S+ 0:00 -bash
1463 pts/2 SN 0:00 oclock
1465 pts/1 S 0:01 emacs Makefile
1480 pts/1 S+ 0:00 ./system1
1481 pts/1 R+ 0:00 ps ax
Done.
Поскольку функция
system
применяет командную оболочку для запуска нужной программы, вы можете перевести ее в фоновый режим, заменив вызов функции в файле system1.с на следующий:
system("ps ах &");
Когда вы откомпилируете и выполните эту версию программы, то получите следующий вывод:
$ ./system2
Running ps with system
PID TTY STAT TIME COMMAND
1 ? S 0:03 init [5]
...
Done.
$ 1274 pts/2 3+ 0:00 -bash
1463 pts/2 SN 0:00 oclock
1465 pts/1 S 0:01 emacs Makefile
1484 pts/1 R 0:00 ps ax
Как это работает
В первом примере программа вызывает функцию
system
со строкой "ps ах
", выполняющую программу ps
. Когда команда ps
завершается, вызов system
system
может быть очень полезной, но она тоже ограничена. Поскольку программа вынуждена ждать, пока не завершится процесс, начатый вызовом system
, вы не можете продолжить выполнение других задач. Во втором примере вызов функции
system
вернет управление программе, как только завершится команда командной оболочки. Поскольку это запрос на выполнение программы в фоновом режиме, командная оболочка вернет управление в программу, как только будет запущена программа ps
, ровно то же, что произошло бы при вводе в строку приглашения командной оболочки команды
$ ps ах &
Далее программа system2 выводит
Done.
и завершается до того, как у команды ps
появится возможность отобразить до конца весь свой вывод. Вывод ps
продолжает формироваться после завершения system2 и в этом случае не включает в список элемент, описывающий процесс system2
. Такое поведение процесса может сильно сбить с толку пользователей. Для того чтобы умело применять процессы, вы должны лучше управлять их действиями. Давайте рассмотрим низкоуровневый интерфейс для создания процесса, exec
. Примечание
Вообще применение функции
system
— далеко не идеальный способ создания процессов, потому что запускаемая программа использует командную оболочку. Он неэффективен вдвойне: и потому что перед запуском программы запускается оболочка, и потому что сильно зависим от варианта установки командной оболочки и применяемого окружения. В следующем разделе вы увидите гораздо более удачный способ запуска программ, который почти всегда предпочтительней применения вызова system
. Замена образа процесса
Существует целое семейство родственных функций, сгруппированных под заголовком
exec
. Они отличаются способом запуска процессов и представлением аргументов программы. Функция exec
замещает текущий процесс новым, заданным в аргументе path
или file
. Функции exec
можно применять для передачи выполнения вашей программы другой программе. Например, перед запуском другого приложения с политикой ограниченного применения вы можете проверить имя пользователя и пароль. Функции exec
более эффективны по сравнению с system
, т.к. исходная программа больше не будет выполняться после запуска новой программы.
#include <unistd.h>
char **environ;
int execl(const char *path, const char *arg0, ..., (char *)0);
int execlp(const char *file, const char *arg0, ..., (char *)0);
int execle(const char *path, const char *arg0, ..., (char *)0,
char *const envp[]);
Поделиться:
Популярные книги
Алекс и Алекс
1. Алекс и Алекс
Фантастика:
боевая фантастика
6.83
рейтинг книги
Идеальный мир для Лекаря 18
18. Лекарь
Фантастика:
юмористическое фэнтези
аниме
5.00
рейтинг книги
Сильнейший Столп Империи. Книга 1
1. Сильнейший Столп Империи
Фантастика:
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Двенадцатая реинкарнация. Трилогия
Фантастика:
боевая фантастика
5.60
рейтинг книги
Истребители. Трилогия
Фантастика:
альтернативная история
7.30
рейтинг книги
Кадет Морозов
4. Живой лёд
Фантастика:
боевая фантастика
5.72
рейтинг книги
Законы Рода. Том 9
9. Граф Берестьев
Фантастика:
городское фэнтези
попаданцы
аниме
дорама
фэнтези
фантастика: прочее
5.00
рейтинг книги
#Бояръ-Аниме. Газлайтер. Том 11
11. История Телепата
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Первый среди равных
1. Первый среди Равных
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Маг
2. Истринский цикл
Фантастика:
фэнтези
8.57
рейтинг книги
Изгой Проклятого Клана. Том 2
2. Изгой
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Дважды одаренный. Том III
3. Дважды одаренный
Фантастика:
альтернативная история
аниме
фэнтези
фантастика: прочее
юмористическое фэнтези
5.00
рейтинг книги
Альбион сгорит!
10. Герой Империи
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Камбер – Еретик
3. Легенда о Камбере Кулдском
Фантастика:
фэнтези
5.00